home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 3.st / BOINGSRC.ARC / BOINGO.S
Encoding:
Text File  |  1985-11-20  |  46.3 KB  |  2,744 lines

  1.  
  2. * Boingo Wizard
  3. * by Frank Cohen & William Robinson
  4. * Copyright 1989 Antic Publishing
  5.  
  6. * Started December 22, 1988
  7. * Version History
  8. * 042389 My 28th Birthday
  9. * 050489 Getting pressured to finish game
  10. * 050989 Took day off to do interview on Starship Enterprise
  11. * 051289 William makes the game work, thank God.
  12. * 051989 "So how's the game coming?" asks Tom Byron
  13. * 052189 Almost done!  Just have to keep it from crashing...
  14. * 052289 Done [Thank God], and uploaded to Gregg at START 76703,1052
  15. * 052389 Last minute tweeking, and complete. Enjoy!
  16. * 070989 Heidi and I get into conceptual argument, after
  17. *        arguing for hours, I add the duck wrap-around feature, it
  18. *        doesn't work, so I take it out.
  19.  
  20. *----------Game Play Values----------*
  21.  
  22. WORMY_START_X EQU 792
  23. WORMY_START_Y EQU 36
  24.  
  25. PLAYER_START_X1 EQU 776
  26. PLAYER_START_X2 EQU 808
  27.  
  28. CELL_HEIGHT EQU 31
  29. CELL_SIZE EQU CELL_HEIGHT*16
  30. CELL_COUNT EQU 8
  31.  
  32. CLIP_TOP EQU CELL_HEIGHT
  33. CLIP_SET EQU 1760    ;(Cell_height-21)*160
  34. CLIP_BOTTOM EQU 200
  35.  
  36. SCORE_POS EQU 1288
  37. SCORE_L EQU 1320
  38. SCORE_MEN EQU 1416
  39. SCORE_OVER EQU 1392
  40.  
  41. SCORE_DISC EQU 150
  42. SCORE_PAD EQU 25
  43. SCORE_LEVEL EQU 450
  44.  
  45. numberofscreens = 5 ; how many screens for page flipping
  46.  
  47. *----------Cold Entry Point---------*
  48.  
  49. START DC $A00A
  50.  
  51.  jsr _logbase
  52.  move.l d0,screenh  *  address of highest screen
  53.  move.l d0,screenpt ; address of current screen
  54.  sub.l #numberofscreens*32000-32000,d0
  55.  move.l d0,screenl  *  address of lowest screen
  56.  sub.l #100,d0
  57.  move.l d0,savea7  *  move stack to under lowest screen
  58.  move.l d0,a7
  59.  
  60.  MOVE #2,-(A7)  ;GET PHYSICAL ADDRESS OF VIDEO RAM
  61.  TRAP #14
  62.  ADD.L #2,A7
  63.  MOVE.L D0,OLDSCREEN
  64.  
  65.  MOVE #4,-(A7) ;GETREZ
  66.  TRAP #14
  67.  ADD.L #2,A7
  68.  MOVE D0,OLD_REZ
  69.  
  70.  CMP #2,D0
  71.  BNE NO_HIGH_REZ
  72.  
  73.  MOVE.L #HIGH_REZ_MES,-(A7)
  74.  MOVE #9,-(A7)
  75.  TRAP #1
  76.  ADD.L #6,A7
  77.  
  78.  MOVE #500,D0
  79. DEL1 MOVE #5000,D1
  80. DEL2 TST.L D1
  81.  DBF D1,DEL2
  82.  DBF D0,DEL1
  83.  
  84.  CLR -(A7)
  85.  TRAP #1
  86.  
  87. HIGH_REZ_MES DC.B 27,'E'
  88.  DC.B 'Thus spake the master programmer:',13,10
  89.  DC.B '  Without the wind, the grass does',13,10
  90.  DC.B '  does not move.  Without software,',13,10
  91.  DC.B '  hardware is useless.',13,10
  92.  DC.B 13,10
  93.  DC.B 'Thus spake the master games tester:',13,10
  94.  DC.B '  Boingo will only play on a color monitor.',13,10,0
  95.  EVEN
  96.  
  97. NO_HIGH_REZ CLR -(A7)  ;FORCE LOW REZ
  98.  MOVE.L #-1,-(A7)
  99.  MOVE.L #-1,-(A7)
  100.  MOVE #5,-(A7)
  101.  TRAP #14
  102.  ADD.L #10,A7
  103.  
  104.  LEA OLD_COLORS,A4
  105.  CLR COUNTER
  106. SAVECLRS MOVE #-1,-(A7) ;SETCOLOR
  107.  MOVE COUNTER,-(A7)
  108.  MOVE #7,-(A7)
  109.  TRAP #14
  110.  ADD.L #6,A7
  111.  MOVE D0,(A4)+
  112.  ADD #1,COUNTER
  113.  CMP #16,COUNTER
  114.  BNE SAVECLRS
  115.  
  116. * Thus spake the master programmer:
  117. * "When you have larned to snatch the error code from the
  118. *  trap frame, it will be time for you to leave."
  119.  
  120. *---------------LOAD DATA FROM FILES---------------*
  121.  
  122.  LEA HLP_COLORS,A2
  123.  LEA HELPDATA,A1
  124.  LEA FNAME5,A0
  125.  JSR LOADFILE
  126.  
  127.  LEA TTL_COLORS,A2
  128.  LEA TITLEDATA,A1
  129.  LEA FNAME4,A0
  130.  JSR LOADFILE
  131.  
  132.  LEA COLORS,A2
  133.  LEA SCOREDATA,A1
  134.  LEA FNAME3,A0
  135.  JSR LOADFILE
  136.  
  137.  LEA COLORS,A2
  138.  LEA PLAYIMAGE,A1
  139.  LEA FNAME2,A0
  140.  JSR LOADFILE
  141.  
  142.  LEA REAL_COLORS,A2
  143.  LEA OPPONENTS,A1
  144.  LEA FNAME1,A0
  145.  JSR LOADFILE
  146.  
  147.  move.l #instblok,INSTADD
  148.  lea ID,a0 ; init sound effect driver
  149.  jsr super
  150.  
  151.  lea gi_308,a0  *  set vblank pointer to my code
  152.  jsr super
  153.  
  154. *---------------GAME INIT----------------*
  155.  
  156.  JSR INIT_CELLS
  157.  JSR INIT_MOVEMENT
  158.  
  159. *----------Title Screen----------*
  160.  
  161. TITLEIT CLR PAUSE_FLAG
  162.  
  163.  LEA TITLEDATA,A0
  164.  MOVE.L screenh,A1
  165.  JSR movescreen
  166.  MOVE.L screenh,screenpt
  167.  
  168.  LEA TTL_COLORS,A0
  169.  LEA COLORS,A1
  170.  MOVE #15,D0
  171. SC1 MOVE (A0)+,(A1)+
  172.  DBF D0,SC1
  173.  
  174. TITLE_LOOP MOVE #11,-(A7)  ;Key pressed?
  175.  TRAP #1
  176.  ADD #2,A7
  177.  TST D0
  178.  BEQ TITLE_LOOP
  179.  
  180.  JSR WAIT_KEY
  181.  MOVE.L D0,D1
  182.  SWAP D1
  183.  CMP.B #$62,D1
  184.  BEQ HELP_SCREEN
  185.  CMP.B #97,D1
  186.  BEQ QUIT
  187.  JMP PLAYGAME
  188.  
  189. *----------Help Screen----------*
  190.  
  191. HELP_SCREEN LEA HELPDATA,A0
  192.  MOVE.L screenh,A1
  193.  JSR movescreen
  194.  MOVE.L screenh,screenpt
  195.  
  196.  LEA HLP_COLORS,A0
  197.  LEA COLORS,A1
  198.  MOVE #15,D0
  199. HSC1 MOVE (A0)+,(A1)+
  200.  DBF D0,HSC1
  201.  
  202. HELP_LOOP MOVE #11,-(A7)  ;Key pressed?
  203.  TRAP #1
  204.  ADD #2,A7
  205.  TST D0
  206.  BEQ HELP_LOOP
  207.  
  208.  JSR WAIT_KEY
  209.  MOVE.L D0,D1
  210.  SWAP D1
  211.  CMP.B #97,D1
  212.  BEQ QUIT
  213.  
  214. *---------------Start A Game----------------*
  215.  
  216. * Something mysterious is formed, born in the silent void.
  217. * Waiting alone and unmoving, it is at once still
  218. * and yet in constant motion.  It is the source of all
  219. * programs.  I do not know its name, so I will call
  220. * it the Tao of Programming.
  221.  
  222. PLAYGAME CLR LEVEL
  223.  CLR.L POINTS
  224.  CLR.L BONUS
  225.  MOVE #3,LIVES
  226.  
  227. *---------------Start A Round----------------*
  228.  
  229. PLAYROUND LEA PLAYIMAGE,A0
  230.  LEA PLAYFIELD,A1
  231.  JSR movescreen
  232.  
  233.  LEA REAL_COLORS,A0
  234.  LEA COLORS,A1
  235.  MOVE #15,D0
  236. SC2 MOVE (A0)+,(A1)+
  237.  DBF D0,SC2
  238.  
  239.  CLR FLOATING
  240.  CLR FLOATING2
  241.  MOVE #45,SQUARE_COUNT
  242.  CLR QUIT_FLAG
  243.  
  244.  CLR.L D0
  245.  JSR SCORED
  246.  
  247.  JSR INIT_PLAYERS
  248.  
  249.  MOVE #99,D0
  250.  LEA GRID,A0
  251. PI_101 CLR.B (A0)+
  252.  DBF D0,PI_101
  253.  
  254.  JSR DISC_PLOT
  255.  JSR RUN_OUT_KEYBOARD
  256.  
  257. *--------------MAIN LOOP---------------*
  258.  
  259. MAINLOOP TST QUIT_FLAG
  260.  BNE QUIT
  261.  TST SQUARE_COUNT
  262.  BEQ END_OF_ROUND
  263.  
  264.  jsr findscreenn
  265.  lea playfield,a0
  266.  move.l screenn,a1
  267.  jsr movescreen
  268.  
  269.  LEA PLAYER_INFO,A0
  270.  CMP #2,DEAD(A0)
  271.  BEQ DEATH
  272.  
  273.  JSR MOVE_MEN
  274.  JSR MOVE_MEN
  275.  JSR COLLIDE
  276.  JSR WORMY_CONTROL
  277.  JSR PLOT_PLAYERS
  278.  move.l screenn,screenpt
  279.  JMP MAINLOOP
  280.  
  281. *----------Death Comes To All----------*
  282.  
  283. * If the Tao is great, then the operating system is great.
  284. * If the operating system is great, then the assembler is
  285. * great.  If the assembler is great, then the application is
  286. * great.  The user is pleased and there is harmony in the world.
  287.  
  288. DEATH jsr deathsoundon
  289.  
  290.  SUB #1,LIVES
  291.  CLR.L D0
  292.  JSR SCORED
  293.  
  294.  TST LIVES
  295.  BPL DE_102
  296.  
  297.  LEA SCOREDATA+14080,A0
  298.  lea playfield,a1
  299.  ADD #SCORE_OVER,A1
  300.  
  301.  MOVE #7,D2
  302. DE_101 MOVE.L (A0),(A1)
  303.  MOVE.L 4(A0),4(A1)
  304.  MOVE.L 8(A0),8(A1)
  305.  MOVE.L 12(A0),12(A1)
  306.  MOVE.L 16(A0),16(A1)
  307.  MOVE.L 20(A0),20(A1)
  308.  MOVE.L 24(A0),24(A1)
  309.  MOVE.L 28(A0),28(A1)
  310.  MOVE.L 32(A0),32(A1)
  311.  MOVE.L 36(A0),36(A1)
  312.  ADD #160,A0
  313.  ADD #160,A1
  314.  DBF D2,DE_101
  315.  
  316. DE_102 MOVE #160,EOR_VAL
  317.  MOVE COLORS+14,-(A7)
  318.  
  319. DE_100 jsr findscreenn
  320.  lea playfield,a0
  321.  move.l screenn,a1
  322.  jsr movescreen
  323.  JSR PLOT_PLAYERS
  324.  move.l screenn,screenpt
  325.  
  326.  EOR #-1,COLORS+14
  327.  
  328.  SUB #1,EOR_VAL
  329.  TST EOR_VAL
  330.  BNE DE_100
  331.  
  332.  MOVE (A7)+,COLORS+14
  333.  
  334.  jsr deathsoundoff
  335.  JSR INIT_PLAYERS
  336.  JSR RUN_OUT_KEYBOARD
  337.  
  338.  TST LIVES
  339.  BPL MAINLOOP
  340.  JMP TITLEIT
  341.  
  342. *----------Collision Detect----------*
  343.  
  344. * The Tao of Programming flows far away
  345. * and returns on the wind of morning.
  346.  
  347. COLLIDE TST FLOATING
  348.  BNE COL_END
  349.  TST FLOATING2
  350.  BNE COL_END
  351.  
  352.  LEA PLAYER_INFO,A4
  353.  MOVE GRIDY(A4),D0
  354.  MOVE GRIDX(A4),D1
  355.  MOVE YPOS(A4),D4
  356.  ADD #6,D4
  357.  MOVE XPOS(A4),D5
  358.  ADD #2,D5
  359.  
  360.  MOVE #PLAYER_MAX-3,D2
  361. COL_100 ADD.L #PLAYER_SIZE,A4
  362.  
  363.  TST ACTIVE(A4)
  364.  BEQ COL_RCRS
  365.  TST BIRTH(A4)
  366.  BNE COL_RCRS
  367.  TST DEAD(A4)
  368.  BNE COL_RCRS
  369.  
  370.  TST GRIDX(A4)
  371.  BNE KILL_100
  372.  TST GRIDY(A4)
  373.  BEQ COL_RCRS
  374.  
  375. KILL_100 CMP GRIDY(A4),D0
  376.  BNE COL_RCRS
  377.  CMP GRIDX(A4),D1
  378.  BNE COL_RCRS
  379.  
  380.  MOVE YPOS(A4),D3
  381.  CMP D3,D4
  382.  BLT COL_RCRS
  383.  ADD #10,D3
  384.  CMP D3,D4
  385.  BGT COL_RCRS
  386.  
  387.  MOVE XPOS(A4),D3
  388.  CMP D3,D5
  389.  BLT COL_RCRS
  390.  ADD #4,D3
  391.  CMP D3,D5
  392.  BGT COL_RCRS
  393.  
  394.  LEA PLAYER_INFO,A4
  395.  MOVE #2,DEAD(A4)
  396.  RTS
  397.  
  398. COL_RCRS DBF D2,COL_100
  399. COL_END RTS
  400.  
  401. *----------Next Level----------*
  402.  
  403. END_OF_ROUND MOVE COLORS+14,-(A7)
  404.  MOVE #SCORE_LEVEL,EOR_VAL
  405.  
  406. EOR_100 jsr findscreenn
  407.  lea playfield,a0
  408.  move.l screenn,a1
  409.  jsr movescreen
  410.  JSR PLOT_PLAYERS
  411.  move.l screenn,screenpt
  412.  
  413.  MOVE EOR_VAL,D0
  414.  AND #$F,D0
  415.  BNE EOR_101
  416.  EOR #$FFFF,COLORS+14
  417.  
  418. EOR_101 MOVE #3,D0
  419.  JSR SCORED
  420.  
  421.  SUB #3,EOR_VAL
  422.  TST EOR_VAL
  423.  BPL EOR_100
  424.  
  425.  MOVE (A7)+,COLORS+14
  426.  
  427. * The Tao gave birth to machine language, which gave birth to
  428. * the assembler.  The assembler gave birth to the compiler.
  429. * Now there are ten thousand languages.
  430.  
  431. * Each language has its purpose, however humble.  Each language
  432. * expresses the yin and yang of software.  Each language
  433. * has its place within the Tao.
  434.  
  435. * But do not program in Cobol if you can avoid it.
  436.  
  437.  JSR INIT_OPPONENTS
  438.  
  439.  MOVE #140,EOR_VAL
  440.  
  441. EOR_200 jsr findscreenn
  442.  lea playfield,a0
  443.  move.l screenn,a1
  444.  jsr movescreen
  445.  JSR PLOT_PLAYERS
  446.  move.l screenn,screenpt
  447.  
  448.  SUB #1,EOR_VAL
  449.  TST EOR_VAL
  450.  BPL EOR_200
  451.  
  452.  ADD #1,LEVEL
  453.  CLR D0
  454.  JSR SCORED
  455.  
  456.  JMP PLAYROUND
  457.  
  458. EOR_VAL DS 1
  459.  
  460. *----------Wormy Movement----------*
  461.  
  462. WORMY_CONTROL MOVE #11,-(A7)  ;Key pressed?
  463.  TRAP #1
  464.  ADD #2,A7
  465.  TST D0
  466.  BEQ MW_RETURN
  467.  
  468.  JSR WAIT_KEY
  469.  MOVE.L D0,D1
  470.  SWAP D1
  471.  CMP.B #97,D1
  472.  BEQ MW_ENDIT
  473.  CMP.B #27,D0
  474.  BEQ MW_PAUSE
  475.  CMP.B #'A',D0
  476.  BEQ MW_LEVEL
  477.  CMP.B #'a',D0
  478.  BEQ MW_LEVEL
  479.  
  480.  CLR.L D2
  481.  CMP.B #49,D0
  482.  BEQ MW_DOJUMP
  483.  ADD #1,D2
  484.  CMP.B #50,D0
  485.  BEQ MW_DOJUMP
  486.  ADD #1,D2
  487.  CMP.B #53,D0
  488.  BEQ MW_DOJUMP
  489.  ADD #1,D2
  490.  CMP.B #52,D0
  491.  BNE MW_RETURN
  492.  
  493. MW_DOJUMP TST FLOATING
  494.  BNE MW_RETURN
  495.  LEA PLAYER_INFO,A4
  496.  TST STATUS(A4)
  497.  BNE MW_RETURN
  498.  
  499.  jsr soundeffectstart ; move "bounce"
  500.  dc 97,100,2,6,2
  501.  MOVE D2,ANIMATE(A4)
  502.  MOVE #1,TIME(A4)
  503.  MOVE #1,STATUS(A4)
  504.  CLR STRETCH(A4)
  505.  
  506.  MULU #4,D2
  507.  ADD.L #GRIDMOVE,D2
  508.  MOVE.L D2,A0
  509.  MOVE GRIDY(A4),D0
  510.  ADD (A0),D0
  511.  MOVE D0,GRIDY(A4)
  512.  MOVE GRIDX(A4),D0
  513.  ADD 2(A0),D0
  514.  MOVE D0,GRIDX(A4)
  515.  RTS
  516.  
  517. MW_LEVEL CLR SQUARE_COUNT
  518.  RTS
  519.  
  520. MW_ENDIT MOVE #1,QUIT_FLAG
  521.  RTS
  522.  
  523. MW_PAUSE MOVE #1,PAUSE_FLAG
  524.  JSR WAIT_KEY   ;Pause mode
  525.  CMP.B #27,D0
  526.  BNE MW_PAUSE
  527.  CLR PAUSE_FLAG
  528.  
  529. MW_RETURN RTS
  530.  
  531. PAUSE_FLAG DC 0
  532.  
  533. GRIDMOVE
  534.  DC 1,0
  535.  DC 0,1
  536.  DC -1,0
  537.  DC 0,-1
  538.  
  539. RUN_OUT_KEYBOARD MOVE #11,-(A7)  ;Key pressed?
  540.  TRAP #1
  541.  ADD #2,A7
  542.  TST D0
  543.  BEQ RUN_OUT2
  544.  JSR WAIT_KEY
  545.  MOVE.L D0,D1
  546.  SWAP D1
  547.  CMP.B #97,D1
  548.  BEQ MW_ENDIT
  549.  CMP.B #27,D0
  550.  BEQ MW_PAUSE
  551.  JMP RUN_OUT_KEYBOARD
  552.  
  553. RUN_OUT2 RTS
  554.  
  555. *----------Move Players----------*
  556.  
  557. XPOS EQU 0
  558. YPOS EQU 2
  559. ANIMATE EQU 4  ;0-DOWN 1-RIGHT 2-UP 3-LEFT
  560. SPEED EQU 6
  561. TIME EQU 8
  562. STATUS EQU 10
  563. STRETCH EQU 12
  564. GRIDX EQU 14
  565. GRIDY EQU 16
  566. TYPE EQU 18   ;0-Wormy 1-Snake 2-Shades 3-Eraser
  567. PRIORITY EQU 20
  568. DEAD EQU 22
  569. BIRTH EQU 24
  570. ACTIVE EQU 26
  571. WAITING EQU 28
  572.  
  573. PLAYER_SIZE EQU 30
  574. PLAYER_MAX EQU 12
  575.  
  576. MOVE_MEN LEA PLAYER_INFO,A4
  577.  CLR COUNTER
  578.  
  579.  TST FLOATING2
  580.  BNE MWF_DOWN
  581.  TST FLOATING
  582.  BEQ MV_LOOP
  583.  
  584.  MOVE TIME(A4),D0
  585.  ADD SPEED(A4),D0
  586.  MOVE D0,TIME(A4)
  587.  CMP #100,D0
  588.  BLT MV_RCRS
  589.  SUB #100,TIME(A4)
  590.  
  591.  ADD #1,FLOATING
  592.  MOVE FLOATING,D0
  593.  AND #3,D0
  594.  TST D0
  595.  BEQ MWF_OVER
  596.  SUB #1,YPOS(A4)
  597. MWF_OVER TST ANIMATE(A4)
  598.  BEQ MWF_LEFT
  599.  SUB #1,XPOS(A4)
  600.  JMP MVF_CHECK
  601. MWF_LEFT ADD #1,XPOS(A4)
  602.  
  603. MVF_CHECK CMP #WORMY_START_X,XPOS(A4)
  604.  BNE MV_RCRS
  605.  MOVE #1,FLOATING2
  606.  JSR INIT_OPPONENTS
  607.  MOVE #SCORE_DISC,D0
  608.  JMP SCORED
  609.  
  610. MWF_DOWN ADD #1,YPOS(A4)
  611.  CMP #WORMY_START_Y,YPOS(A4)
  612.  BNE MV_RCRS
  613.  jsr soundeffectstop
  614.  dc 3
  615.  CLR FLOATING
  616.  CLR FLOATING2
  617.  JSR RUN_OUT_KEYBOARD
  618.  JMP MV_RCRS
  619.  
  620. *---Move Opponents---*
  621.  
  622. MV_LOOP TST ACTIVE(A4)
  623.  BEQ MV_RCRS
  624.  
  625.  TST WAITING(A4)
  626.  BEQ MV_IT_NOW
  627.  SUB #1,WAITING(A4)
  628.  JMP MV_RCRS
  629.  
  630. MV_IT_NOW MOVE TIME(A4),D0
  631.  ADD SPEED(A4),D0
  632.  MOVE D0,TIME(A4)
  633.  CMP #100,D0
  634.  BLT MV_RCRS
  635.  SUB #100,TIME(A4)
  636.  
  637.  TST DEAD(A4)
  638.  BNE PLAYER_FALLS
  639.  TST BIRTH(A4)
  640.  BNE MV_ALIVE
  641.  TST STATUS(A4)
  642.  BNE MV_JUMPING
  643.  
  644.  TST COUNTER  ;Direct Opponents
  645.  BEQ MV_RCRS
  646.  CMP #1,TYPE(A4)
  647.  BEQ MV_SNAKE
  648.  
  649. ;Shades movement logic
  650.  
  651.  MOVE #1,STATUS(A4)
  652.  CLR STRETCH(A4)
  653.  MOVE #10,TIME(A4)
  654.  
  655.  jsr _random
  656.  dc 10
  657.  move random,d2
  658.  AND.L #1,D2
  659.  MOVE D2,ANIMATE(A4)
  660.  
  661.  JSR EDGE_DETECT
  662.  MOVE D0,DEAD(A4)
  663.  BNE MV_RCRS
  664.  
  665.  MULU #4,D2
  666.  ADD.L #GRIDMOVE,D2
  667.  MOVE.L D2,A0
  668.  CLR.L D0
  669.  MOVE GRIDY(A4),D0
  670.  ADD (A0),D0
  671.  MOVE D0,GRIDY(A4)
  672.  MOVE GRIDX(A4),D0
  673.  ADD 2(A0),D0
  674.  MOVE D0,GRIDX(A4)
  675.  JMP MV_RCRS
  676.  
  677. ;Snake movement logic
  678.  
  679. MV_SNAKE MOVE #1,STATUS(A4)
  680.  CLR STRETCH(A4)
  681.  MOVE #10,TIME(A4)
  682.  
  683.  MOVE GRIDX(A4),D4
  684.  MOVE GRIDY(A4),D5
  685.  
  686.  CLR.L D2
  687.  TST FLOATING
  688.  BEQ MV_SNAKE99
  689.  jsr _random
  690.  dc 4
  691.  move random,d2
  692.  JMP MV_SNAKE101
  693.  
  694. MV_SNAKE99 LEA PLAYER_INFO,A0
  695.  MOVE #3,D2
  696.  MOVE GRIDX(A0),D0
  697.  CMP GRIDX(A4),D0
  698.  BEQ MV_SNAKE100
  699.  BLT MV_SNAKE101
  700.  MOVE #1,D2
  701.  JMP MV_SNAKE101
  702.  
  703. MV_SNAKE100 MOVE #2,D2
  704.  MOVE GRIDY(A0),D0
  705.  CMP GRIDY(A4),D0
  706.  BLT MV_SNAKE101
  707.  CLR D2
  708.  
  709. MV_SNAKE101 MOVE D2,ANIMATE(A4)
  710.  MOVE D4,GRIDX(A4)
  711.  MOVE D5,GRIDY(A4)
  712.  
  713.  MOVE.L D2,D3
  714.  MULU #4,D3
  715.  ADD.L #GRIDMOVE,D3
  716.  MOVE.L D3,A0
  717.  CLR.L D0
  718.  MOVE GRIDY(A4),D0
  719.  ADD (A0),D0
  720.  MOVE D0,GRIDY(A4)
  721.  MOVE GRIDX(A4),D0
  722.  ADD 2(A0),D0
  723.  MOVE D0,GRIDX(A4)
  724.  JSR EDGE_DETECT
  725.  CLR PRIORITY(A4)
  726.  TST D0
  727.  BEQ MV_RCRS
  728.  
  729.  ADD #1,D2
  730.  AND.L #3,D2
  731.  JMP MV_SNAKE101
  732.  
  733. * Player jumps through the air, with the greatest of ease.
  734.  
  735. MV_JUMPING ADD #1,STATUS(A4)
  736.  
  737.  CLR.L D6
  738.  MOVE ANIMATE(A4),D6
  739.  MULU #MOVEMENT3-MOVEMENT,D6
  740.  ADD.L #MOVETBL,D6
  741.  MOVE.L D6,A0
  742.  CLR.L D0
  743.  MOVE STATUS(A4),D0
  744.  SUB #2,D0
  745.  MULU #6,D0
  746.  ADD.L D0,A0
  747.  CMP #99,(A0)
  748.  BEQ MV_HIT
  749.  
  750.  CLR.L D0
  751.  MOVE YPOS(A4),D0
  752.  ADD (A0),D0
  753.  MOVE D0,YPOS(A4)
  754.  
  755.  CLR.L D0
  756.  MOVE XPOS(A4),D0
  757.  ADD 2(A0),D0
  758.  MOVE D0,XPOS(A4)
  759.  
  760.  CLR.L D0
  761.  MOVE STRETCH(A4),D0
  762.  ADD 4(A0),D0
  763.  MOVE D0,STRETCH(A4)
  764.  JMP MV_RCRS
  765.  
  766. * Player lands?
  767.  
  768. MV_HIT CLR STATUS(A4)  ;Jump onto a floating disc?
  769.  CLR STRETCH(A4)
  770.  CLR WAITING(A4)
  771.  
  772.  MOVE TYPE(A4),D0      ;Did Wormy or Eraser land on a tile?
  773.  BEQ MV_CHECK_TILE
  774.  CMP #3,D0
  775.  BNE MV_RCRS
  776.  
  777. MV_CHECK_TILE MOVE.L DISC_ADR,A0  ;Did Wormy land on a disc?
  778.  MOVE #3,D1
  779. MV_HIT2 TST.L (A0)
  780.  BEQ MV_HIT3
  781.  MOVE GRIDX(A4),D0
  782.  CMP 2(A0),D0
  783.  BNE MV_HIT3
  784.  MOVE GRIDY(A4),D0
  785.  CMP (A0),D0
  786.  BEQ MV_FLOAT
  787. MV_HIT3 ADD.L #4,A0
  788.  DBF D1,MV_HIT2
  789.  
  790.  JSR EDGE_DETECT  ;Nope, landed on a regular tile.
  791.  MOVE D0,DEAD(A4)
  792.  TST D0
  793.  BNE MV_FELL
  794.  JSR FILL_SQUARE
  795.  JMP MV_RCRS
  796.  
  797. MV_FELL TST COUNTER  ;Fell of side of grid
  798.  BNE MV_RCRS
  799.  jsr soundeffectstart
  800.  dc 111,127,1,6,1
  801.  JMP MV_RCRS
  802.  
  803. MV_FLOAT JSR DISC_REMOVE  ;Set up variables to float Wormy to top of grid
  804.  LEA PLAYER_INFO,A4
  805.  jsr soundeffectstart
  806.  dc 72,120,3,6,3
  807.  MOVE #1,FLOATING
  808.  CLR FLOATING2
  809.  MOVE #1,TIME(A4)
  810.  CLR STRETCH(A4)
  811.  MOVE #1,GRIDX(A4)
  812.  MOVE #1,GRIDY(A4)
  813.  MOVE #1,D0
  814.  CMP #3,ANIMATE(A4)
  815.  BNE MM_F100
  816.  CLR D0
  817. MM_F100 MOVE D0,ANIMATE(A4)
  818.  
  819. MV_RCRS ADD.L #PLAYER_SIZE,A4
  820.  ADD #1,COUNTER
  821.  CMP #PLAYER_MAX,COUNTER
  822.  BNE MV_LOOP
  823.  
  824. MV_END RTS
  825.  
  826. * Player falls off grid
  827.  
  828. PLAYER_FALLS CLR GRIDX(A4)
  829.  CLR GRIDY(A4)
  830.  
  831.  ADD #1,YPOS(A4)
  832.  CMP #CLIP_BOTTOM+CELL_HEIGHT,YPOS(A4)
  833.  BNE MV_RCRS
  834.  MOVE #2,DEAD(A4)
  835.  CLR ACTIVE(A4)
  836.  
  837.  TST COUNTER
  838.  BEQ MV_RCRS
  839.  
  840.  jsr _random
  841.  dc 60000
  842.  move random,d0
  843.  MOVE D0,D2
  844.  MOVE D2,D3
  845.  MOVE #PLAYER_START_X1,D1
  846.  MOVE #1,GRIDX(A4)
  847.  MOVE #2,GRIDY(A4)
  848.  AND #1,D0
  849.  BEQ MV_PI_200
  850.  MOVE #PLAYER_START_X2,D1
  851.  MOVE #2,GRIDX(A4)
  852.  MOVE #1,GRIDY(A4)
  853.  
  854. MV_PI_200 MOVE D1,XPOS(A4)
  855.  MOVE #1,YPOS(A4)
  856.  MOVE #1,PRIORITY(A4)
  857.  MOVE #15*60,WAITING(A4)
  858.  MOVE #1,BIRTH(A4)
  859.  MOVE #1,ACTIVE(A4)
  860.  CLR DEAD(A4)
  861.  CLR STATUS(A4)
  862.  JMP MV_RCRS
  863.  
  864. MV_ALIVE CMP #1,YPOS(A4)    ;Fall from sky onto screen
  865.  BNE MV_ALIVE3
  866.  jsr soundeffectstart
  867.  dc 93,100,0,6,0
  868.  
  869. MV_ALIVE3 ADD #1,YPOS(A4)
  870.  CMP #CLIP_TOP,YPOS(A4)
  871.  BEQ MV_ALIVE2
  872.  CMP #49,YPOS(A4)
  873.  BNE MV_RCRS
  874.  CLR BIRTH(A4)
  875.  CMP #3,TYPE(A4)
  876.  BNE MV_RCRS
  877.  JSR FILL_SQUARE
  878.  JMP MV_RCRS
  879. MV_ALIVE2 CLR PRIORITY(A4)
  880.  JMP MV_RCRS
  881.  
  882. *----------Fall Off Side----------*
  883.  
  884. EDGE_DETECT TST GRIDX(A4)
  885.  BMI EDGE_YES
  886.  BEQ EDGE_YES
  887.  TST GRIDY(A4)
  888.  BMI EDGE_YES
  889.  BEQ EDGE_YES
  890.  
  891.  MOVE #10,D0
  892.  SUB GRIDY(A4),D0
  893.  CMP GRIDX(A4),D0
  894.  BGE EDGE_NO
  895.  CLR PRIORITY(A4)
  896.  MOVE #1,D0
  897.  RTS
  898.  
  899. EDGE_YES MOVE #1,PRIORITY(A4)
  900.  MOVE #1,D0
  901.  RTS
  902.  
  903. EDGE_NO CLR D0
  904.  RTS
  905.  
  906. *----------Install Movement Tables---------*
  907.  
  908. * A novice asked the master: "Here is a programmer who
  909. * never designs, documents, or tests his programs.  Yet
  910. * all who know him consider him one of the best programmers
  911. * in the world.  Why is this?"
  912.  
  913. * The master replied: "That programmer has mastered the Tao.
  914. * He has gone beyond the need for design;  he does not
  915. * become angry when the system crashes, but accepts the universe
  916. * without concern.  He has gone beyond the need for documentation;
  917. * he no longer cares if anyone sees his code.  He has gone beyond
  918. * the need for testing;  each of his programs are perfect within
  919. * themselves, serene and elegant, their purpose self-evident.
  920.  
  921. * "Truly, he has entered the mystery of Tao."
  922.  
  923. INIT_MOVEMENT LEA MOVETBL,A1
  924.  
  925.  LEA MOVEMENT,A0
  926.  MOVE #1,D0
  927.  MOVE #1,D1
  928.  MOVE.L #6,D3
  929.  JSR IM_100
  930.  
  931.  LEA MOVEMENT,A0
  932.  MOVE #1,D0
  933.  MOVE #-1,D1
  934.  MOVE.L #6,D3
  935.  JSR IM_100
  936.  
  937.  LEA MOVEMENT2,A0
  938.  MOVE #-1,D0
  939.  MOVE #-1,D1
  940.  MOVE.L #-6,D3
  941.  JSR IM_100
  942.  
  943.  LEA MOVEMENT2,A0
  944.  MOVE #-1,D0
  945.  MOVE #1,D1
  946.  MOVE.L #-6,D3
  947.  
  948. IM_100 MOVE (A0),(A1)
  949.  CMP #99,(A0)
  950.  BEQ IM_101
  951.  
  952.  MOVE (A0),D2
  953.  MULS D0,D2
  954.  MOVE D2,(A1)
  955.  
  956. IM_101 MOVE 2(A0),D2
  957.  MULS D1,D2
  958.  MOVE D2,2(A1)
  959.  
  960.  MOVE 4(A0),4(A1)
  961.  
  962.  CMP #99,(A0)
  963.  BEQ IM_END
  964.  ADD.L D3,A0
  965.  ADD #6,A1
  966.  JMP IM_100
  967.  
  968. IM_END ADD #6,A1
  969.  RTS
  970.  
  971.  DC 99,0,0 ;END MARKER
  972. MOVEMENT
  973.  DC -1,0,0
  974.  DC -1,0,0
  975.  DC -1,-1,0
  976.  DC -1,0,0
  977.  DC -1,-1,0
  978.  DC -1,-1,0
  979.  DC -1,-1,0
  980.  DC -1,-1,0
  981.  DC 0,-1,0
  982.  DC -1,0,0
  983.  DC 0,-1,1
  984.  DC 0,-1,0
  985.  DC 1,-1,0
  986.  DC 0,-1,0
  987.  DC 1,-1,0
  988.  DC 0,-1,0
  989.  DC 1,0,0
  990.  DC 1,-1,0
  991.  DC 1,0,0
  992.  DC 1,-1,0
  993.  DC 1,0,0
  994.  DC 1,0,0
  995.  DC 1,0,0
  996.  DC 1,-1,0
  997.  DC 1,0,0
  998.  DC 1,0,0
  999.  DC 1,0,0
  1000.  DC 1,0,0
  1001.  DC 1,-1,0
  1002.  DC 1,0,0
  1003.  DC 1,0,0
  1004.  DC 1,0,0
  1005.  DC 1,0,1
  1006.  DC 1,0,0
  1007.  DC 1,0,0
  1008. MOVEMENT2 DC 1,0,0
  1009.  DC 99,0,0 ;END MARKER
  1010. MOVEMENT3 DC 0,0,0
  1011.  
  1012. *----------Fill A Square----------*
  1013.  
  1014. FILL_SQUARE TST GRIDX(A4)
  1015.  BMI NO_FILL
  1016.  TST GRIDY(A4)
  1017.  BMI NO_FILL
  1018.  TST DEAD(A4)
  1019.  BNE NO_FILL
  1020.  TST STATUS(A4)
  1021.  BNE NO_FILL
  1022.  
  1023.  CLR.L D0   ;Find tile info
  1024.  MOVE GRIDY(A4),D0
  1025.  SUB #1,D0
  1026.  MULU #9,D0
  1027.  ADD GRIDX(A4),D0
  1028.  SUB #1,D0
  1029.  ADD.L #GRID,D0
  1030.  MOVE.L D0,A0
  1031.  
  1032.  TST COUNTER   ;Wormy or Eraser?
  1033.  BNE FILL_ERASER
  1034.  
  1035.  TST.B (A0)    ;Tile ready for flipping?
  1036.  BNE NO_FILL
  1037.  MOVE.B #1,(A0)
  1038.  SUB #1,SQUARE_COUNT
  1039.  MOVE #SCORE_PAD,D0
  1040.  JSR SCORED
  1041.  MOVE #1,D7
  1042.  JMP FILL_IT
  1043.  
  1044. FILL_ERASER TST.B (A0) ;Tile already flipped?
  1045.  BEQ NO_FILL
  1046.  CLR.B (A0)
  1047.  ADD #1,SQUARE_COUNT
  1048.  CLR D7
  1049.  
  1050. FILL_IT LEA PLAYFIELD,A1
  1051.  
  1052.  CLR.L D0
  1053.  MOVE GRIDY(A4),D0
  1054.  ADD GRIDX(A4),D0
  1055.  SUB #2,D0
  1056.  MULU #13,D0
  1057.  ADD #54,D0
  1058.  MULU #160,D0
  1059.  ADD.L D0,A1
  1060.  
  1061.  CLR.L D0
  1062.  MOVE #10,D0
  1063.  SUB GRIDY(A4),D0
  1064.  ADD GRIDX(A4),D0
  1065.  SUB #1,D0
  1066.  MULU #8,D0
  1067.  
  1068.  ADD.L D0,A1
  1069.  
  1070.  MOVE #6,D3
  1071.  LEA UN_FILL_PAT,A0
  1072.  TST D7
  1073.  BEQ UN_FILL_100
  1074.  LEA FILL_PAT,A0
  1075.  
  1076. FILL_100 MOVE (A1),D0
  1077.  SWAP D0
  1078.  MOVE 8(A1),D0
  1079.  OR.L (A0),D0
  1080.  MOVE D0,8(A1)
  1081.  SWAP D0
  1082.  MOVE D0,(A1)+
  1083.  
  1084.  MOVE (A1),D0
  1085.  SWAP D0
  1086.  MOVE 8(A1),D0
  1087.  OR.L (A0),D0
  1088.  MOVE D0,8(A1)
  1089.  SWAP D0
  1090.  MOVE D0,(A1)+
  1091.  
  1092.  MOVE (A1),D0
  1093.  SWAP D0
  1094.  MOVE 8(A1),D0
  1095.  OR.L (A0),D0
  1096.  MOVE D0,8(A1)
  1097.  SWAP D0
  1098.  MOVE D0,(A1)+
  1099.  
  1100.  MOVE (A1),D0
  1101.  SWAP D0
  1102.  MOVE 8(A1),D0
  1103.  MOVE.L (A0),D1
  1104.  EOR.L #-1,D1
  1105.  AND.L D1,D0
  1106.  MOVE D0,8(A1)
  1107.  SWAP D0
  1108.  MOVE D0,(A1)+
  1109.  
  1110.  ADD #4,A0
  1111.  ADD #160-8,A1
  1112.  DBF D3,FILL_100
  1113.  RTS
  1114.  
  1115. UN_FILL_100 MOVE (A1),D0
  1116.  SWAP D0
  1117.  MOVE 8(A1),D0
  1118.  AND.L (A0),D0
  1119.  MOVE D0,8(A1)
  1120.  SWAP D0
  1121.  MOVE D0,(A1)+
  1122.  
  1123.  MOVE (A1),D0
  1124.  SWAP D0
  1125.  MOVE 8(A1),D0
  1126.  MOVE.L (A0),D1
  1127.  EOR.L #-1,D1
  1128.  OR.L D1,D0
  1129.  MOVE D0,8(A1)
  1130.  SWAP D0
  1131.  MOVE D0,(A1)+
  1132.  
  1133.  MOVE (A1),D0
  1134.  SWAP D0
  1135.  MOVE 8(A1),D0
  1136.  AND.L (A0),D0
  1137.  MOVE D0,8(A1)
  1138.  SWAP D0
  1139.  MOVE D0,(A1)+
  1140.  
  1141.  MOVE (A1),D0
  1142.  SWAP D0
  1143.  MOVE 8(A1),D0
  1144.  AND.L (A0),D0
  1145.  MOVE D0,8(A1)
  1146.  SWAP D0
  1147.  MOVE D0,(A1)+
  1148.  
  1149.  ADD #4,A0
  1150.  ADD #160-8,A1
  1151.  DBF D3,UN_FILL_100
  1152.  
  1153. NO_FILL RTS
  1154.  
  1155. FILL_PAT
  1156.  DC.L $000FF000
  1157.  DC.L $00FFFF00
  1158.  DC.L $0FFFFFF0
  1159.  DC.L $FFFFFFFF
  1160.  DC.L $0FFFFFF0
  1161.  DC.L $00FFFF00
  1162.  DC.L $000FF000
  1163.  
  1164. UN_FILL_PAT
  1165.  DC.L $FFF00FFF
  1166.  DC.L $FF0000FF
  1167.  DC.L $F000000F
  1168.  DC.L $00000000
  1169.  DC.L $F000000F
  1170.  DC.L $FF0000FF
  1171.  DC.L $FFF00FFF
  1172.  
  1173. *----------Draw Characters----------*
  1174.  
  1175. PLOT_PLAYERS LEA PLAYER_INFO,A4
  1176.  CLR COUNTER
  1177. PP_RPT TST ACTIVE(A4)
  1178.  BEQ PP_RPT2
  1179.  JSR DO_PLOT
  1180. PP_RPT2 ADD.L #PLAYER_SIZE,A4
  1181.  ADD #1,COUNTER
  1182.  CMP #PLAYER_MAX,COUNTER
  1183.  BLT PP_RPT
  1184.  RTS
  1185.  
  1186. DO_PLOT MOVE TYPE(A4),D2
  1187.  CMP #3,D2
  1188.  BNE PP_F1B
  1189.  MOVE #2,D2
  1190. PP_F1B MULU #96,D2
  1191.  MOVE ANIMATE(A4),D3
  1192.  MULU #24,D3
  1193.  ADD.L D3,D2
  1194.  MOVE STRETCH(A4),D3
  1195.  MULU #8,D3
  1196.  ADD.L D3,D2
  1197.  MOVE XPOS(A4),D0
  1198.  LSR #1,D0
  1199.  AND.L #7,D0
  1200.  ADD.L D0,D2
  1201.  MULU #CELL_SIZE,D2
  1202.  ADD.L #CELLS,D2
  1203.  MOVE.L D2,A0
  1204.  
  1205.  MOVE #CELL_HEIGHT-1,D3
  1206.  move.l screenn,a1
  1207.  move XPOS(a4),d0
  1208.  lsr #4,d0
  1209.  lsl #3,d0
  1210.  add d0,a1
  1211.  move YPOS(a4),d0
  1212.  add #19,d0
  1213.  sub d3,d0
  1214.  bpl en210
  1215.  add d0,d3
  1216.  muls #-16,d0
  1217.  add.l d0,a0
  1218.  clr d0
  1219. en210 move d0,d1
  1220.  mulu #160,d1
  1221.  add.l d1,a1
  1222.  move d0,d1
  1223.  add d3,d1
  1224.  cmp #200,d1
  1225.  bcs en218
  1226.  move #199,d3
  1227.  sub d0,d3
  1228. en218 tst d3
  1229.  bmi rtss
  1230.  
  1231.  TST PRIORITY(A4)
  1232.  BNE PP_BACKGROUND
  1233.  
  1234. PP_100 move (a0),d0
  1235.  or 2(a0),d0
  1236.  or 4(a0),d0
  1237.  or 6(a0),d0
  1238.  eor #-1,d0
  1239.  and d0,(a1)
  1240.  and d0,2(a1)
  1241.  and d0,4(a1)
  1242.  and d0,6(a1)
  1243.  move 8(a0),d0
  1244.  or 10(a0),d0
  1245.  or 12(a0),d0
  1246.  or 14(a0),d0
  1247.  eor #-1,d0
  1248.  and d0,8(a1)
  1249.  and d0,10(a1)
  1250.  and d0,12(a1)
  1251.  and d0,14(a1)
  1252.  move.l (a0),d0
  1253.  or.l d0,(a1)
  1254.  move.l 4(a0),d0
  1255.  or.l d0,4(a1)
  1256.  move.l 8(a0),d0
  1257.  or.l d0,8(a1)
  1258.  move.l 12(a0),d0
  1259.  or.l d0,12(a1)
  1260.  
  1261.  ADD #16,A0
  1262.  ADD #160,A1
  1263.  
  1264.  dbf d3,PP_100
  1265.  rts
  1266.  
  1267. PP_BACKGROUND move (a1),d2 ; Player has lower priority than playfield
  1268.  or 2(a1),d2
  1269.  or 4(a1),d2
  1270.  or 6(a1),d2
  1271.  eor #-1,d2
  1272.  move d2,d0
  1273.  swap d0
  1274.  move d2,d0
  1275.  move 8(a1),d2
  1276.  or 10(a1),d2
  1277.  or 12(a1),d2
  1278.  or 14(a1),d2
  1279.  eor #-1,d2
  1280.  move d2,d1
  1281.  swap d1
  1282.  move d2,d1
  1283.  move.l (a0),d2
  1284.  and.l d0,d2
  1285.  or.l d2,(a1)
  1286.  move.l 4(a0),d2
  1287.  and.l d0,d2
  1288.  or.l d2,4(a1)
  1289.  move.l 8(a0),d2
  1290.  and.l d1,d2
  1291.  or.l d2,8(a1)
  1292.  move.l 12(a0),d2
  1293.  and.l d1,d2
  1294.  or.l d2,12(a1)
  1295.  
  1296.  ADD #16,A0
  1297.  ADD #160,A1
  1298.  
  1299.  dbf d3,PP_BACKGROUND
  1300.  rts
  1301.  
  1302. * A novice programmer was once assigned to code a simplified
  1303. * financial package.
  1304. * The novice worked furiously for many days, but when his master
  1305. * reviewed the program, he discovered that it contained a screen
  1306. * editor, a set of generalized graphics routines, an artificial
  1307. * inteligence interface, but not the slightest mention of
  1308. * anything financial.
  1309.  
  1310. * When the master asked about this, the novice became indignant.
  1311. * "Don't be so impatient, " he said, "I'll put in the financial
  1312. * stuff eventually."
  1313.  
  1314. *----------------ESTABLISH CELL PATTERNS----------------*
  1315.  
  1316. INIT_CELLS LEA CELLS,A1
  1317.  
  1318.  LEA OPPONENTS,A0  ;Wormy
  1319.  ADD #9*160,A0
  1320.  LEA CELLS,A1
  1321.  JSR CELL_GRAB
  1322.  LEA OPPONENTS,A0
  1323.  ADD #49*160,A0
  1324.  JSR CELL_GRAB
  1325.  LEA OPPONENTS,A0
  1326.  ADD #129*160,A0
  1327.  JSR CELL_GRAB
  1328.  LEA OPPONENTS,A0
  1329.  ADD #89*160,A0
  1330.  JSR CELL_GRAB
  1331.  
  1332.  LEA OPPONENTS,A0  ;Mr. Snake
  1333.  ADD #9*160,A0
  1334.  ADD #48,A0
  1335.  JSR CELL_GRAB
  1336.  LEA OPPONENTS,A0
  1337.  ADD #49*160,A0
  1338.  ADD #48,A0
  1339.  JSR CELL_GRAB
  1340.  LEA OPPONENTS,A0
  1341.  ADD #129*160,A0
  1342.  ADD #48,A0
  1343.  JSR CELL_GRAB
  1344.  LEA OPPONENTS,A0
  1345.  ADD #89*160,A0
  1346.  ADD #48,A0
  1347.  JSR CELL_GRAB
  1348.  
  1349.  LEA OPPONENTS,A0  ;Shades
  1350.  ADD #9*160,A0
  1351.  ADD #96,A0
  1352.  JSR CELL_GRAB
  1353.  LEA OPPONENTS,A0
  1354.  ADD #49*160,A0
  1355.  ADD #96,A0
  1356.  JSR CELL_GRAB
  1357.  LEA OPPONENTS,A0
  1358.  ADD #129*160,A0
  1359.  ADD #96,A0
  1360.  JSR CELL_GRAB
  1361.  LEA OPPONENTS,A0
  1362.  ADD #89*160,A0
  1363.  ADD #96,A0
  1364.  
  1365. CELL_GRAB CLR COUNT
  1366.  
  1367. CE_PAT2 CLR COUNT2
  1368.  
  1369. CE_PAT1 MOVE COUNT2,D2
  1370.  LSL #1,D2
  1371.  JSR MAKE_CELL
  1372.  
  1373.  ADD #1,COUNT2
  1374.  CMP #CELL_COUNT,COUNT2
  1375.  BNE CE_PAT1
  1376.  
  1377.  ADD #16,A0
  1378.  ADD #1,COUNT
  1379.  CMP #3,COUNT
  1380.  BNE CE_PAT2
  1381. rtss rts
  1382.  
  1383. *---------------FILL A CELL---------------*
  1384. * A0 - Source address from DEGAS screen
  1385. * A1 - Destination Cell address
  1386. * D2 - # of bits to rotate right
  1387.  
  1388. MAKE_CELL MOVE.L A0,A2
  1389.  MOVE.L A1,A3
  1390.  MOVE #CELL_HEIGHT-1,D0
  1391. CE_100 MOVE.L (A2)+,(A3)+
  1392.  MOVE.L (A2)+,(A3)+
  1393.  MOVE.L (A2)+,(A3)+
  1394.  MOVE.L (A2)+,(A3)+
  1395.  ADD #160-16,A2
  1396.  DBF D0,CE_100
  1397.  
  1398.  TST D2
  1399.  BEQ CE_DONE
  1400.  
  1401. CE_101 MOVE #CELL_HEIGHT-1,D0
  1402.  MOVE.L A1,A2
  1403. CE_102 CLR.L D1
  1404.  MOVE (A2),D1
  1405.  SWAP D1
  1406.  MOVE 8(A2),D1
  1407.  ROR.L #1,D1
  1408.  MOVE D1,8(A2)
  1409.  SWAP D1
  1410.  MOVE D1,(A2)
  1411.  
  1412.  CLR.L D1
  1413.  MOVE 2(A2),D1
  1414.  SWAP D1
  1415.  MOVE 10(A2),D1
  1416.  ROR.L #1,D1
  1417.  MOVE D1,10(A2)
  1418.  SWAP D1
  1419.  MOVE D1,2(A2)
  1420.  
  1421.  CLR.L D1
  1422.  MOVE 4(A2),D1
  1423.  SWAP D1
  1424.  MOVE 12(A2),D1
  1425.  ROR.L #1,D1
  1426.  MOVE D1,12(A2)
  1427.  SWAP D1
  1428.  MOVE D1,4(A2)
  1429.  
  1430.  CLR.L D1
  1431.  MOVE 6(A2),D1
  1432.  SWAP D1
  1433.  MOVE 14(A2),D1
  1434.  ROR.L #1,D1
  1435.  MOVE D1,14(A2)
  1436.  SWAP D1
  1437.  MOVE D1,6(A2)
  1438.  
  1439.  ADD.L #16,A2
  1440.  DBF D0,CE_102
  1441.  DBF D2,CE_101
  1442.  
  1443. CE_DONE ADD #CELL_SIZE,A1
  1444.  RTS
  1445.  
  1446. *----------Init Playfield----------*
  1447.  
  1448. COPYFLIP2 MOVE.L (A0)+,(A1)+
  1449.  DBF D0,COPYFLIP2
  1450.  RTS
  1451.  
  1452. *----------Floating Discs----------*
  1453.  
  1454. DISC_PLOT LEA DISCLOC2,A0
  1455.  LEA DISCLOC,A1
  1456.  MOVE #127,D0
  1457. DISC_I100 MOVE.B (A0)+,(A1)+
  1458.  DBF D0,DISC_I100
  1459.  
  1460.  MOVE LEVEL,D0
  1461.  AND.L #7,D0
  1462.  MULU #16,D0
  1463.  ADD.L #DISCLOC,D0
  1464.  MOVE.L D0,A0
  1465.  MOVE.L A0,DISC_ADR
  1466.  
  1467.  MOVE #3,D5
  1468.  
  1469. DISC_LOOP TST.L (A0)
  1470.  BEQ DISC_RCRS
  1471.  
  1472.  LEA OPPONENTS,A1
  1473.  ADD #9*160,A1
  1474.  ADD #144,A1
  1475.  
  1476.  CLR.L D0
  1477.  MOVE (A0),D0
  1478.  ADD 2(A0),D0
  1479.  SUB #2,D0
  1480.  MULU #13,D0
  1481.  ADD #54,D0
  1482.  MULU #160,D0
  1483.  ADD.L #PLAYFIELD,D0
  1484.  MOVE.L D0,A2
  1485.  CLR.L D0
  1486.  MOVE #10,D0
  1487.  SUB (A0),D0
  1488.  ADD 2(A0),D0
  1489.  SUB #1,D0
  1490.  MULU #8,D0
  1491.  ADD.L D0,A2
  1492.  
  1493.  MOVE #8,D3
  1494. DISC_100 MOVE #3,D2
  1495. DISC_101 MOVE (A2),D0
  1496.  SWAP D0
  1497.  MOVE 8(A2),D0
  1498.  
  1499.  MOVE (A1),D1
  1500.  SWAP D1
  1501.  MOVE 8(A1),D1
  1502.  
  1503.  OR.L D1,D0
  1504.  
  1505.  MOVE D0,8(A2)
  1506.  SWAP D0
  1507.  MOVE D0,(A2)
  1508.  
  1509.  ADD #2,A1
  1510.  ADD #2,A2
  1511.  
  1512.  DBF D2,DISC_101
  1513.  
  1514.  ADD #160-8,A1
  1515.  ADD #160-8,A2
  1516.  
  1517.  DBF D3,DISC_100
  1518.  
  1519. DISC_RCRS ADD #4,A0
  1520.  DBF D5,DISC_LOOP
  1521.  RTS
  1522.  
  1523. DISC_REMOVE CLR.L D0
  1524.  MOVE (A0),D0
  1525.  ADD 2(A0),D0
  1526.  SUB #2,D0
  1527.  MULU #13,D0
  1528.  ADD #54,D0
  1529.  MULU #160,D0
  1530.  MOVE.L D0,A2
  1531.  CLR.L D0
  1532.  MOVE #10,D0
  1533.  SUB (A0),D0
  1534.  ADD 2(A0),D0
  1535.  SUB #1,D0
  1536.  MULU #8,D0
  1537.  ADD.L D0,A2
  1538.  ADD.L #PLAYFIELD,A2
  1539.  
  1540.  CLR.L (A0)  ;Remove this disc
  1541.  
  1542.  LEA FILL_PAT,A1
  1543.  MOVE #7,D3
  1544. DISC_R100 MOVE #3,D2
  1545. DISC_R101 MOVE (A2),D0
  1546.  SWAP D0
  1547.  MOVE 8(A2),D0
  1548.  
  1549.  MOVE.L (A1),D1
  1550.  EOR.L #-1,D1
  1551.  AND.L D1,D0
  1552.  
  1553.  MOVE D0,8(A2)
  1554.  SWAP D0
  1555.  MOVE D0,(A2)+
  1556.  
  1557.  DBF D2,DISC_R101
  1558.  ADD #160-8,A2
  1559.  ADD #4,A1
  1560.  DBF D3,DISC_R100
  1561.  RTS
  1562.  
  1563. *-----------LOAD A FILE-------------*
  1564. * A0 = PTR TO FILE NAME
  1565. * A1 = PTR TO LOCATION
  1566.  
  1567. LOADFILE MOVE.L A1,LFADR
  1568.  SUB.L #2,A2
  1569.  MOVE.L A2,LFCOLORADR
  1570.  
  1571.  CLR -(A7)  ;F_OPEN
  1572.  MOVE.L A0,-(A7)
  1573.  MOVE #$3D,-(A7)
  1574.  TRAP #1
  1575.  ADD #8,A7
  1576.  
  1577.  TST D0
  1578.  BMI QUIT
  1579.  MOVE D0,FHANDLE
  1580.  
  1581.  MOVE.L LFCOLORADR,-(A7) ;F_read
  1582.  MOVE.L #34,-(A7)
  1583.  MOVE FHANDLE,-(A7)
  1584.  MOVE #$3F,-(A7)
  1585.  TRAP #1
  1586.  ADD #12,A7
  1587.  
  1588.  MOVE.L #DECODE,-(A7)  ;F_READ
  1589.  MOVE.L #32000,-(A7)
  1590.  MOVE FHANDLE,-(A7)
  1591.  MOVE #$3F,-(A7)
  1592.  TRAP #1
  1593.  ADD #12,A7
  1594.  MOVE.L D0,LFSIZE
  1595.  
  1596.  MOVE FHANDLE,-(A7)   ;F_CLOSE
  1597.  MOVE #$3E,-(A7)
  1598.  TRAP #1
  1599.  ADD #4,A7
  1600.  
  1601.  MOVE.L LFSIZE,D0
  1602.  MOVE.L LFADR,A0
  1603.  MOVE.L #DECODE,A1
  1604.  
  1605. *****************************************************
  1606. * DEGAS COMPRESSED PICTURE DECODER (LOW RESOLUTION) *
  1607. * D0 - # OF BYTES TO DECOMPRESS                     *
  1608. * A0 - DESTINATION ADDRESS                          *
  1609. * A1 - SOURCE ADDRESS                               *
  1610. *****************************************************
  1611.  
  1612.  CLR D3
  1613.  MOVE #200,D6
  1614. DEGAS_LINE MOVE #4,D5
  1615.  SUB #1,D6
  1616.  TST D6
  1617.  BEQ DEGAS_DONE
  1618.  
  1619. DE_COLOR MOVE #40,D4
  1620. DEGAS_LOOP CMP.L #1,D0
  1621.  BLT DEGAS_DONE
  1622.  
  1623.  SUB.L #1,D0
  1624.  CLR.L D1
  1625.  MOVE.B (A1)+,D1
  1626.  CMP.B #128,D1
  1627.  BEQ DEGAS_LOOP
  1628.  
  1629.  TST.B D1
  1630.  BMI DEGAS_DUPLICATE
  1631.  
  1632. DEGAS_COPYLP MOVE.B (A1)+,(A0)
  1633.  SUB.L #1,D0
  1634.  SUB #1,D4
  1635.  
  1636.  TST D3
  1637.  BNE DEGAS_COPYLP2
  1638.  ADD #1,A0
  1639.  MOVE #1,D3
  1640.  JMP DEGAS_COPYRCRS
  1641. DEGAS_COPYLP2 ADD #7,A0
  1642.  CLR D3
  1643.  
  1644. DEGAS_COPYRCRS DBF D1,DEGAS_COPYLP
  1645.  TST D4
  1646.  BNE DEGAS_LOOP
  1647.  SUB #158,A0
  1648.  SUB #1,D5
  1649.  TST D5
  1650.  BNE DE_COLOR
  1651.  ADD #152,A0
  1652.  JMP DEGAS_LINE
  1653.  
  1654. DEGAS_DUPLICATE MULS #-1,D1
  1655.  AND #$FF,D1
  1656.  MOVE.B (A1)+,D2
  1657.  SUB.L #1,D0
  1658.  
  1659. DEGAS_DUPLP MOVE.B D2,(A0)
  1660.  
  1661.  SUB #1,D4
  1662.  
  1663.  TST D3
  1664.  BNE DEGAS_DUPLP2
  1665.  ADD #1,A0
  1666.  MOVE #1,D3
  1667.  JMP DEGAS_DUPRCRS
  1668. DEGAS_DUPLP2 ADD #7,A0
  1669.  CLR D3
  1670.  
  1671. DEGAS_DUPRCRS DBF D1,DEGAS_DUPLP
  1672.  
  1673.  TST D4
  1674.  BNE DEGAS_LOOP
  1675.  SUB #158,A0
  1676.  SUB #1,D5
  1677.  TST D5
  1678.  BNE DE_COLOR
  1679.  ADD #152,A0
  1680.  JMP DEGAS_LINE
  1681.  
  1682. DEGAS_DONE RTS
  1683.  
  1684. *-------------EXIT-------------*
  1685.  
  1686. QUIT lea gi_309,a0  ;Disable 200 HZ interrupt
  1687.  jsr super
  1688.  
  1689.  MOVE OLD_REZ,-(A7)
  1690.  MOVE.L OLDSCREEN,-(A7)
  1691.  MOVE.L #-1,-(A7)
  1692.  MOVE #5,-(A7)
  1693.  TRAP #14
  1694.  ADD.L #12,A7
  1695.  
  1696.  MOVE.L #OLD_COLORS,-(A7)  ;SET COLOR PALETTE
  1697.  MOVE #6,-(A7)
  1698.  TRAP #14
  1699.  ADD.L #6,A7
  1700.  
  1701.  DC $A009
  1702.  
  1703.  CLR -(A7)
  1704.  TRAP #1
  1705.  
  1706. WAIT_KEY MOVE #7,-(A7)
  1707.  TRAP #1
  1708.  ADD.L #2,A7
  1709.  RTS
  1710.  
  1711. *---------------Scoring--------------*
  1712.  
  1713. SCORED AND.L #$FFFF,D0
  1714.  MOVE.L D0,D1
  1715.  ADD.L POINTS,D0
  1716.  MOVE.L D0,POINTS
  1717.  
  1718.  ADD.L BONUS,D1     ;Bonus life
  1719.  MOVE.L D1,BONUS
  1720.  CMP.L #5000,D1
  1721.  BLE BUTUSCREWT
  1722.  CLR.L BONUS
  1723.  ADD #1,LIVES
  1724.  
  1725. BUTUSCREWT AND.L #$FFFF,D0
  1726.  DIVU #10000,D0
  1727.  MOVE.L D0,D1
  1728.  AND.L #15,D0
  1729.  MULU #1280,D0
  1730.  ADD.L #SCOREDATA,D0
  1731.  MOVE.L D0,A0
  1732.  lea playfield,a1
  1733.  ADD.L #SCORE_POS,A1
  1734.  JSR SCOR_IT
  1735.  
  1736.  SWAP D1
  1737.  AND.L #$FFFF,D1
  1738.  DIVU #1000,D1
  1739.  MOVE.L D1,D0
  1740.  AND.L #15,D1
  1741.  MULU #1280,D1
  1742.  ADD.L #SCOREDATA,D1
  1743.  MOVE.L D1,A0
  1744.  lea playfield,a1
  1745.  ADD.L #SCORE_POS+1,A1
  1746.  JSR SCOR_IT
  1747.  
  1748.  SWAP D0
  1749.  AND.L #$FFFF,D0
  1750.  DIVU #100,D0
  1751.  MOVE.L D0,D1
  1752.  AND.L #15,D0
  1753.  MULU #1280,D0
  1754.  ADD.L #SCOREDATA,D0
  1755.  MOVE.L D0,A0
  1756.  lea playfield,a1
  1757.  ADD.L #SCORE_POS+8,A1
  1758.  JSR SCOR_IT
  1759.  
  1760.  SWAP D1
  1761.  AND.L #$FFFF,D1
  1762.  DIVU #10,D1
  1763.  MOVE.L D1,D0
  1764.  AND.L #15,D1
  1765.  MULU #1280,D1
  1766.  ADD.L #SCOREDATA,D1
  1767.  MOVE.L D1,A0
  1768.  lea playfield,a1
  1769.  ADD.L #SCORE_POS+9,A1
  1770.  JSR SCOR_IT
  1771.  
  1772.  SWAP D0
  1773.  AND.L #15,D0
  1774.  MULU #1280,D0
  1775.  ADD.L #SCOREDATA,D0
  1776.  MOVE.L D0,A0
  1777.  lea playfield,a1
  1778.  ADD.L #SCORE_POS+16,A1
  1779.  JSR SCOR_IT
  1780.  
  1781. * Plot Level Display
  1782.  
  1783.  CLR.L D1
  1784.  MOVE LEVEL,D1
  1785.  ADD #1,D1
  1786.  DIVU #10,D1
  1787.  MOVE.L D1,D0
  1788.  AND.L #15,D1
  1789.  MULU #1280,D1
  1790.  ADD.L #SCOREDATA,D1
  1791.  MOVE.L D1,A0
  1792.  lea playfield,a1
  1793.  ADD.L #SCORE_L,A1
  1794.  JSR SCOR_IT
  1795.  
  1796.  SWAP D0
  1797.  AND.L #15,D0
  1798.  MULU #1280,D0
  1799.  ADD.L #SCOREDATA,D0
  1800.  MOVE.L D0,A0
  1801.  lea playfield,a1
  1802.  ADD.L #SCORE_L+1,A1
  1803.  JSR SCOR_IT
  1804.  
  1805. * Plot lives
  1806.  
  1807.  LEA SCOREDATA+15360,A0
  1808.  lea playfield,a1
  1809.  ADD #SCORE_MEN,A1
  1810.  JSR SCOR_IT
  1811.  
  1812.  LEA SCOREDATA+15360,A0
  1813.  lea playfield,a1
  1814.  ADD #SCORE_MEN+1,A1
  1815.  JSR SCOR_IT
  1816.  
  1817.  LEA SCOREDATA+15360,A0
  1818.  lea playfield,a1
  1819.  ADD #SCORE_MEN+8,A1
  1820.  JSR SCOR_IT
  1821.  
  1822.  LEA SCOREDATA+15360,A0
  1823.  lea playfield,a1
  1824.  ADD #SCORE_MEN+9,A1
  1825.  JSR SCOR_IT
  1826.  
  1827.  MOVE LIVES,D1
  1828.  BEQ SCOREND
  1829.  
  1830.  LEA SCOREDATA+12800,A0
  1831.  lea playfield,a1
  1832.  ADD #SCORE_MEN,A1
  1833.  JSR SCOR_IT
  1834.  
  1835.  CMP #1,D1
  1836.  BEQ SCOREND
  1837.  
  1838.  LEA SCOREDATA+12800,A0
  1839.  lea playfield,a1
  1840.  ADD #SCORE_MEN+1,A1
  1841.  JSR SCOR_IT
  1842.  
  1843.  CMP #2,D1
  1844.  BEQ SCOREND
  1845.  
  1846.  LEA SCOREDATA+12800,A0
  1847.  lea playfield,a1
  1848.  ADD #SCORE_MEN+8,A1
  1849.  JSR SCOR_IT
  1850.  
  1851.  CMP #3,D1
  1852.  BEQ SCOREND
  1853.  
  1854.  LEA SCOREDATA+12800,A0
  1855.  lea playfield,a1
  1856.  ADD #SCORE_MEN+9,A1
  1857.  
  1858. SCOR_IT MOVE #7,D2
  1859. SCOR_100 MOVE.B (A0),(A1)
  1860.  MOVE.B 2(A0),2(A1)
  1861.  MOVE.B 4(A0),4(A1)
  1862.  MOVE.B 6(A0),6(A1)
  1863.  ADD #160,A0
  1864.  ADD #160,A1
  1865.  DBF D2,SCOR_100
  1866.  SUB #160*8,A0
  1867.  SUB #160*8,A1
  1868.  
  1869. SCOREND RTS
  1870.  
  1871. deathsoundon jsr soundeffectstart
  1872.  dc 70,127,4,6,4
  1873.  rts
  1874. deathsoundoff jsr soundeffectstop
  1875.  dc 4
  1876.  rts
  1877.  
  1878. *----------Start Players----------*
  1879.  
  1880. INIT_PLAYERS lea PLAYER_INFO,a0
  1881.  MOVE #PLAYER_SIZE-1,D0
  1882. IP_100 CLR.B (A0)+
  1883.  DBF D0,IP_100
  1884.  
  1885.  LEA PLAYER_INFO,A4
  1886.  MOVE #WORMY_START_X,XPOS(A4)
  1887.  MOVE #WORMY_START_Y,YPOS(A4)
  1888.  MOVE #1,ACTIVE(A4)
  1889.  MOVE #1,GRIDX(A4)
  1890.  MOVE #1,GRIDY(A4)
  1891.  MOVE #98,SPEED(A4)
  1892.  
  1893. INIT_OPPONENTS LEA PLAYER_INFO+PLAYER_SIZE,A0
  1894.  MOVE #PLAYER_MAX-2,D0
  1895. IOP_100 MOVE #PLAYER_SIZE-1,D1
  1896. IOP_101 CLR.B (A0)+
  1897.  DBF D1,IOP_101
  1898.  DBF D0,IOP_100
  1899.  
  1900.  MOVE LEVEL,D0
  1901.  AND.L #7,D0
  1902.  MULU #4,D0
  1903.  ADD.L #LEVS,D0
  1904.  MOVE.L D0,A0
  1905.  MOVE.L (A0),A3
  1906.  
  1907.  LEA PLAYER_INFO,A4
  1908.  
  1909. PI_402 ADD.L #PLAYER_SIZE,A4
  1910.  CMP #EOF,(A3)
  1911.  BEQ rtss
  1912.  
  1913.  MOVE (A3),TYPE(A4)
  1914.  MOVE 2(A3),D0
  1915.  MULU #60,D0
  1916.  MOVE D0,WAITING(A4)
  1917.  MOVE 4(A3),SPEED(A4)
  1918.  
  1919.  jsr _random
  1920.  dc 2 ; get value (0-1)
  1921.  move random,d0
  1922.  MOVE #PLAYER_START_X1,D1
  1923.  MOVE #1,GRIDX(A4)
  1924.  MOVE #2,GRIDY(A4)
  1925.  tst d0
  1926.  BEQ PI_200
  1927.  MOVE #PLAYER_START_X2,D1
  1928.  MOVE #2,GRIDX(A4)
  1929.  MOVE #1,GRIDY(A4)
  1930. PI_200 MOVE D1,XPOS(A4)
  1931.  MOVE #1,YPOS(A4)
  1932.  MOVE #1,PRIORITY(A4)
  1933.  MOVE #1,BIRTH(A4)
  1934.  MOVE #1,ACTIVE(A4)
  1935.  
  1936.  ADD.L #6,A3
  1937.  JMP PI_402
  1938.  
  1939. LEVS DC.L LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6,LEVEL7,LEVEL8
  1940.  
  1941. WORMY EQU 0
  1942. SNAKE EQU 1
  1943. SHADES EQU 2
  1944. ERASER EQU 3
  1945. EOF EQU -1
  1946.  
  1947. LEVEL1 DC SHADES,10,80
  1948.  DC SHADES,20,85
  1949.  DC SHADES,25,90
  1950.  DC SHADES,30,95
  1951.  DC SHADES,35,96
  1952.  DC EOF
  1953.  
  1954. LEVEL2 DC SHADES,5,65
  1955.  DC SHADES,10,70
  1956.  DC SHADES,15,75
  1957.  DC SNAKE,20,80
  1958.  DC SHADES,25,90
  1959.  DC SHADES,30,95
  1960.  DC EOF
  1961.  
  1962. LEVEL3 DC SHADES,5,100
  1963.  DC SNAKE,10,85
  1964.  DC SHADES,15,50
  1965.  DC SHADES,20,60
  1966.  DC ERASER,25,70
  1967.  DC SHADES,28,80
  1968.  DC SHADES,30,85
  1969.  DC SHADES,34,90
  1970.  DC SHADES,40,95
  1971.  DC EOF
  1972.  
  1973. LEVEL4 DC ERASER,5,60
  1974.  DC SNAKE,10,80
  1975.  DC SHADES,12,70
  1976.  DC SHADES,14,65
  1977.  DC ERASER,18,86
  1978.  DC SHADES,24,90
  1979.  DC SHADES,28,75
  1980.  DC EOF
  1981.  
  1982. LEVEL5 DC SNAKE,8,45
  1983.  DC SNAKE,10,80
  1984.  DC ERASER,13,85
  1985.  DC ERASER,16,40
  1986.  DC EOF
  1987.  
  1988. LEVEL6 DC SHADES,5,80
  1989.  DC SHADES,8,85
  1990.  DC SHADES,10,90
  1991.  DC SHADES,12,85
  1992.  DC ERASER,18,80
  1993.  DC ERASER,22,75
  1994.  DC SNAKE,25,82
  1995.  DC EOF
  1996.  
  1997. LEVEL7 DC SHADES,2,65
  1998.  DC SHADES,4,62
  1999.  DC SHADES,6,75
  2000.  DC ERASER,8,85
  2001.  DC SHADES,15,90
  2002.  DC SNAKE,18,85
  2003.  DC SNAKE,22,85
  2004.  DC EOF
  2005.  
  2006. LEVEL8 DC SNAKE,2,93
  2007.  DC ERASER,4,93
  2008.  DC SNAKE,6,40
  2009.  DC SHADES,8,89
  2010.  DC SNAKE,12,85
  2011.  DC ERASER,14,85
  2012.  DC SNAKE,16,60
  2013.  DC ERASER,18,95
  2014.  DC SHADES,22,91
  2015.  DC EOF
  2016.  
  2017. DISCLOC2
  2018.  DC 4,0  ;Locations of floating discs
  2019.  DC 7,0  ;Each level has four possible discs
  2020.  DC 0,5
  2021.  DC 0,8
  2022.  
  2023.  DC 5,0  ;Level 2
  2024.  DC 8,0
  2025.  DC 0,9
  2026.  DC 0,0
  2027.  
  2028.  DC 2,0  ;Level 3
  2029.  DC 8,0
  2030.  DC 0,4
  2031.  DC 0,7
  2032.  
  2033.  DC 5,0  ;Level 4
  2034.  DC 0,0
  2035.  DC 0,0
  2036.  DC 0,0
  2037.  
  2038.  DC 8,0  ;Level 5
  2039.  DC 9,0
  2040.  DC 0,8
  2041.  DC 0,9
  2042.  
  2043.  DC 3,0  ;Level 6
  2044.  DC 5,0
  2045.  DC 0,8
  2046.  DC 0,0
  2047.  
  2048.  DC 0,7  ;Level 7
  2049.  DC 0,2
  2050.  DC 0,0
  2051.  DC 0,0
  2052.  
  2053.  DC 9,0  ;Level 8
  2054.  DC 3,0
  2055.  DC 0,9
  2056.  DC 0,2
  2057.  
  2058. *----------Sound Effects----------*
  2059.  
  2060. shrink_box     move.l   #shrink_noise,-(a7)
  2061.                move.w   #32,-(a7)      ; output sound string
  2062.                trap     #14            ; call xbios
  2063.                addq.l   #6,a7          ; restore stack
  2064.                rts
  2065. shrink_noise   dc.b  $00,$08,$01,$02,$02,$00,$03,$00,$04,$00,$05,$00
  2066.                dc.b  $06,$00,$07,$fe,$08,$10,$09,$00,$0a,$00,$0b,$00
  2067.                dc.b  $0c,$00,$0d,$0d,$80,$08,$81,$00,$02,$20,$07,$ff
  2068.                dc.b  $ff,$00
  2069.  
  2070. *---------Text Storage---------*
  2071.  
  2072. FNAME1 DC.B 'BOINKMEN.PC1',0
  2073. FNAME2 DC.B 'BOINKFLD.PC1',0
  2074. FNAME3 DC.B 'BOINKSCR.PC1',0
  2075. FNAME4 DC.B 'BOINKTTL.PC1',0
  2076. FNAME5 DC.B 'BOINKHLP.PC1',0
  2077.  EVEN
  2078.  
  2079. _logbase move #3,-(a7)
  2080.  trap #14
  2081.  add #2,a7
  2082.  rts
  2083.  
  2084. gi_308 move.l 112,gi_318
  2085.  move.l #gi_315,112
  2086.  move.l $114,xs_114  *  200hz system clock interrupt vector
  2087.  move.l #xs_115,$114
  2088.  rts
  2089.  
  2090. gi_309 move.l gi_318,112
  2091.  move.l xs_114,$114
  2092.  BSET #0,1156
  2093.  rts
  2094.  
  2095. * This is the VBLANK code
  2096. gi_315 move.b screenpt+1,$ff8201
  2097.  move.b screenpt+2,$ff8203
  2098.  
  2099.  ADD #1,VCOUNT
  2100.  
  2101.  TST PAUSE_FLAG
  2102.  BNE RT_DONE
  2103.  ADD #1,COLOR_COUNT  ;Rotate colors
  2104.  CMP #5,COLOR_COUNT
  2105.  BLT RT_DONE
  2106.  CLR COLOR_COUNT
  2107.  MOVE.L D0,-(A7)
  2108.  MOVE COLORS+24,D0
  2109.  MOVE COLORS+22,COLORS+24
  2110.  MOVE COLORS+20,COLORS+22
  2111.  MOVE COLORS+18,COLORS+20
  2112.  MOVE D0,COLORS+18
  2113.  MOVE.L (A7)+,D0
  2114.  
  2115. RT_DONE move.l COLORS,$ff8240
  2116.  move.l COLORS+4,$ff8240+4
  2117.  move.l COLORS+8,$ff8240+8
  2118.  move.l COLORS+12,$ff8240+12
  2119.  move.l COLORS+16,$ff8240+16
  2120.  move.l COLORS+20,$ff8240+20
  2121.  move.l COLORS+24,$ff8240+24
  2122.  move.l COLORS+28,$ff8240+28
  2123.  
  2124.  dc $4ef9
  2125. gi_318 dc.l 0
  2126.  
  2127. super move.l a0,-(a7)
  2128.  move #38,-(a7)
  2129.  trap #14
  2130.  add #6,a7
  2131.  rts
  2132.  
  2133. * This routine gets jumped to 200 times per second.  It maintains the
  2134. * 1000hz timer.
  2135. xs_115 movem.l a0-a6/d0-d7,-(a7)
  2136.  add.l #5,hz_1000
  2137.  jsr music200
  2138.  movem.l (a7)+,a0-a6/d0-d7
  2139.  dc $4ef9
  2140. xs_114 dc.l 0
  2141. hz_1000 dc.l 0 ; 1000 hz clock
  2142.  
  2143. movescreen move #799,d0  *  copy 32000 bytes from (a0) to (a1)
  2144. kv329 move.l (a0)+,(a1)+
  2145.  move.l (a0)+,(a1)+
  2146.  move.l (a0)+,(a1)+
  2147.  move.l (a0)+,(a1)+
  2148.  move.l (a0)+,(a1)+
  2149.  move.l (a0)+,(a1)+
  2150.  move.l (a0)+,(a1)+
  2151.  move.l (a0)+,(a1)+
  2152.  move.l (a0)+,(a1)+
  2153.  move.l (a0)+,(a1)+
  2154.  dbf d0,kv329
  2155.  rts
  2156.  
  2157. clearscreen move #799,d0  *  clear 32000 bytes from (a0)
  2158. dg403 clr.l (a0)+
  2159.  clr.l (a0)+
  2160.  clr.l (a0)+
  2161.  clr.l (a0)+
  2162.  clr.l (a0)+
  2163.  clr.l (a0)+
  2164.  clr.l (a0)+
  2165.  clr.l (a0)+
  2166.  clr.l (a0)+
  2167.  clr.l (a0)+
  2168.  dbf d0,dg403
  2169.  rts
  2170.  
  2171. findscreenn move.l screenpt,a0  *  find next screen to use
  2172.  add #32000,a0
  2173.  cmp.l screenh,a0
  2174.  ble kx204
  2175.  move.l screenl,a0
  2176. kx204 move.l a0,screenn
  2177.  rts
  2178. screenl dc.l 0
  2179. screenh dc.l 0
  2180. screenn dc.l 0
  2181. screenpt dc.l 0
  2182.  
  2183. ; put a 16bit random number in random
  2184. ; all registers are preserved
  2185. _random movem.l a0-a2/d0-d2,-(a7)
  2186.  move #17,-(a7)  *  generate a random number
  2187.  trap #14
  2188.  add #2,a7
  2189.  and.l #$ffff,d0
  2190.  move.l 24(a7),a0
  2191.  divu (a0)+,d0
  2192.  swap d0
  2193.  move d0,random
  2194.  move.l a0,24(a7)
  2195.  movem.l (a7)+,a0-a2/d0-d2
  2196.  rts
  2197. random dc 0
  2198.  
  2199. *****************************************************************
  2200. *  SOUND EFFECT ROUTINES
  2201. *****************************************************************
  2202. CHANINST EQU 0
  2203. CHANTRK EQU 6
  2204. CHANVOL EQU 12
  2205. CHANPIT EQU 18
  2206. CHANAEST EQU 24
  2207. CHANAESTp1 = CHANAEST+1
  2208. CHANARELST EQU 30
  2209. CHANPEST EQU 36
  2210. CHANPESTp1 = CHANPEST+1
  2211. CHANPRELST EQU 42
  2212. CHANPRIO EQU 48
  2213. CHANSTLO EQU 54
  2214. CHANSTHI EQU 60
  2215. CHANVM EQU 66
  2216. CHANPITOFF EQU 72
  2217. CHANPORTPIT EQU 78
  2218. CHANPORTSPD EQU 84
  2219. CHANPORTSPDp1 = CHANPORTSPD+1
  2220. CHANVIBPIT EQU 90
  2221. CHANVIBSPD EQU 96
  2222. CHANVIBSPDp1 = CHANVIBSPD+1
  2223. CHANVIBDEP EQU 102
  2224. CHANVIBDEPp1 = CHANVIBDEP+1
  2225. INSAENV EQU 0
  2226. INSAENVp2 = INSAENV+2
  2227. INSAREL EQU 32
  2228. INSAREP EQU 33
  2229. INSPENV EQU 34
  2230. INSPENVp2 = INSPENV+2
  2231. INSPREL EQU 66
  2232. INSPREP EQU 67
  2233. INSVIBSPD EQU 68
  2234. INSVIBDEP EQU 69
  2235. INSTRN EQU 71
  2236. INSPORT EQU 72
  2237. INSWAVE EQU 73
  2238. INSSIZE EQU 74
  2239. TRKINDEX EQU 0
  2240. TRKNOTEOFF EQU 32
  2241. TRKFETCH EQU 64
  2242. TRKINST EQU 96
  2243.  
  2244. ID BCLR #0,1156 ;NO BLEEPS
  2245.  CLR MUSICON
  2246.  MOVE.B #$7F,REG7
  2247.  MOVE.L #-1,CHANDATA
  2248.  MOVE #-1,CHANDATA+4 ;CHAN INST
  2249.  MOVE.L #-1,CHANDATA+CHANTRK
  2250.  MOVE #-1,CHANDATA+CHANTRK+4
  2251.  RTS
  2252.  
  2253. STOPSONG lea STOPS,a0
  2254.  jsr super
  2255.  RTS
  2256.  
  2257. STOPS CLR MUSICON
  2258.  move.b #127,REG7
  2259.  MOVE #4,D2
  2260.  lea CHANDATA,A2
  2261. STOPS0 move.b #-1,CHANINST(A2,D2.w)
  2262.  CLR D1
  2263.  MOVE D2,D0
  2264.  LSR #1,D0
  2265.  ADD #8,D0
  2266.  jsr WSCHIP
  2267.  SUB #2,D2
  2268.  BPL STOPS0
  2269.  RTS
  2270.  
  2271. STARTSONG MOVE.L SONGADD,A0
  2272.  MOVE.L #TRKDATA,A1
  2273.  MOVE #7,D1
  2274. SS1 move.b #-1,TRKNOTEOFF(A1)
  2275.  move.b #-1,TRKFETCH(A1)
  2276.  CLR.L TRKINST(A1)
  2277.  CLR.L D0
  2278.  MOVE (A0)+,D0
  2279.  BEQ SS2
  2280.  ADD.L SONGADD,D0
  2281.  CLR.L TRKFETCH(A1)
  2282. SS2 MOVE.L D0,(A1)+ ;TRKINDEX
  2283.  DBF D1,SS1
  2284.  MOVE.L #-1,CLOCK
  2285.  move.b #-1,MUSICON
  2286.  RTS
  2287.  
  2288. music200 BCHG #1,HALF
  2289.  BEQ RTSS
  2290.  TST MUSICON
  2291.  BEQ EXIT
  2292.  ADD.L #1,CLOCK
  2293.  MOVE.L #TRKDATA,A0
  2294. INT1 MOVE.L CLOCK,D0
  2295.  CMP.L TRKNOTEOFF(A0),D0
  2296.  BEQ DONOTEOFF
  2297.  CMP.L TRKFETCH(A0),D0
  2298.  BNE NEXTTRK
  2299.  MOVE.L TRKINDEX(A0),A1
  2300.  MOVE 2(A1),D1
  2301.  EXT.L D1
  2302.  ADD.L D0,D1
  2303.  MOVE.L D1,TRKFETCH(A0)
  2304.  MOVE.B 4(A1),D1
  2305.  BPL NOTE
  2306.  AND.L #$7F,D1
  2307.  MOVE.L D1,TRKINST(A0)
  2308.  ADD.L #6,TRKINDEX(A0)
  2309.  jmp DONOTEOFF
  2310.  
  2311. NOTE CLR.L D1
  2312.  MOVE (A1),D1
  2313.  ADD.L D0,D1
  2314.  MOVE.L D1,TRKNOTEOFF(A0)
  2315.  CLR D1
  2316.  MOVE.B 4(A1),D1  ;NOTE NUMBER
  2317.  CLR D2
  2318.  MOVE.B 5(A1),D2  ;NOTE VOLUME
  2319.  MOVE.L TRKINST(A0),D3 ;NOTE INSTRUMENT
  2320.  MOVE #5,D4  ;PRIORITY
  2321.  MOVE.L A0,D5
  2322.  SUB.L #TRKDATA,D5
  2323.  LSR #2,D5  ;TRACK
  2324.  jsr NOTEON
  2325.  ADD.L #6,TRKINDEX(A0)
  2326.  jmp INT1
  2327. DONOTEOFF MOVE.L #-1,TRKNOTEOFF(A0)
  2328.  MOVE.L TRKINST(A0),D3
  2329.  MOVE.L INSTADD,A1
  2330.  MULU 2(A1),D3
  2331.  ADD.L D3,A1
  2332.  ADD #4,A1
  2333.  TST.B INSPORT(A1)
  2334.  BNE INT1
  2335.  MOVE.L A0,D5  ;ONLY NEEDS TRACK #
  2336.  SUB.L #TRKDATA,D5
  2337.  LSR #2,D5
  2338.  jsr NOTEOFF
  2339.  jmp INT1
  2340. NEXTTRK ADD #4,A0
  2341.  CMP.L #TRKDATA+32,A0
  2342.  BNE INT1
  2343. EXIT jmp UPDATECHAN
  2344.  
  2345. soundeffectstart movem.l a0-a6/d0-d7,-(a7)
  2346.  move.l 60(a7),a0
  2347.  move (a0)+,d1
  2348.  move (a0)+,d2
  2349.  move (a0)+,d3
  2350.  move (a0)+,d4
  2351.  move (a0)+,d5
  2352.  move.l a0,60(a7)
  2353.  jsr STARTNOTE
  2354.  movem.l (a7)+,a0-a6/d0-d7
  2355.  rts
  2356.  
  2357. soundeffectstop movem.l a0-a6/d0-d7,-(a7)
  2358.  move.l 60(a7),a0
  2359.  move (a0)+,d5
  2360.  move.l a0,60(a7)
  2361.  jsr STOPNOTE
  2362.  movem.l (a7)+,a0-a6/d0-d7
  2363.  rts
  2364.  
  2365. STARTNOTE
  2366. NOTEON MOVE.L #CHANDATA,A2
  2367.  MOVE D3,D6
  2368.  MOVE.L INSTADD,A3
  2369.  MULU 2(A3),D6
  2370.  ADD D6,A3
  2371.  ADD #4,A3
  2372.  TST.B INSPORT(A3)
  2373.  BNE STARTPORT
  2374. NOPORT MOVE #4,D0 ;STEAL ANY CHAN NOT USED
  2375. NO1 TST CHANINST(A2,D0.w)
  2376.  BMI STEAL
  2377.  SUB #2,D0
  2378.  BPL NO1
  2379.  
  2380.  MOVE #4,D0 ;STEAL ANY CHAN OF LOWER PRIORITY
  2381. NO2 CMP CHANPRIO(A2,D0.w),D4
  2382.  BHI STEAL
  2383.  SUB #2,D0
  2384.  BPL NO2
  2385.  
  2386.  MOVE #4,D0 ;STEAL ANY CHAN OF SAME TRK
  2387. NO0 CMP CHANTRK(A2,D0.w),D5
  2388.  BEQ STEAL
  2389.  SUB #2,D0
  2390.  BPL NO0
  2391.  
  2392.  MOVE #4,D0 ;STEAL ANY CHAN IN RELEASE STAGE
  2393. NO3 MOVE CHANAEST(A2,D0.w),D6
  2394.  CMP.B CHANARELST(A2,D0.w),D6
  2395.  BCS NO33
  2396.  CMP CHANPRIO(A2,D0.w),D4
  2397.  BCC STEAL
  2398. NO33 SUB #2,D0
  2399.  BPL NO3
  2400.  
  2401.  MOVE #4,D0 ;STEAL OLDEST CHAN
  2402.  MOVE.L CLOCK,TEMP1
  2403.  move.b #-1,TEMP2
  2404. NO4 MOVE CHANSTHI(A2,D0.w),D6
  2405.  SWAP D6
  2406.  MOVE CHANSTLO(A2,D0.w),D6
  2407.  CMP.L TEMP1,D6
  2408.  BCC NO5
  2409.  CMP CHANPRIO(A2,D0.w),D4
  2410.  BCS NO5
  2411.  MOVE.L D6,TEMP1
  2412.  MOVE D0,TEMP2
  2413. NO5 SUB #2,D0
  2414.  BPL NO4
  2415.  MOVE TEMP2,D0
  2416.  BMI RTSS
  2417.  
  2418. STEAL move.b #-1,CHANINST(A2,D0.w)
  2419.  MOVE D5,CHANTRK(A2,D0.w)
  2420.  CLR CHANVOL(A2,D0.w)
  2421.  MOVE.L #PITCHTAB,A1
  2422.  ADD.B INSTRN(A3),D1
  2423.  AND.L #$FF,D1
  2424.  DIVU #12,D1
  2425.  SWAP D1
  2426.  ASL #1,D1
  2427.  MOVE 0(A1,D1.w),D5
  2428.  SWAP D1
  2429.  SUB #2,D1
  2430.  LSR D1,D5
  2431.  MOVE D5,CHANPITOFF(A2,D0.w)
  2432.  MOVE.B INSAREL(A3),CHANARELST(A2,D0.w)
  2433.  CLR CHANPEST(A2,D0.w)
  2434.  MOVE.B INSPREL(A3),CHANPRELST(A2,D0.w)
  2435.  CLR CHANVIBSPD(A2,D0.w)
  2436.  MOVE.B INSVIBSPD(A3),CHANVIBSPDp1(A2,D0.w)
  2437.  MOVE.B INSVIBDEP(A3),CHANVIBDEPp1(A2,D0.w)
  2438.  MOVE.B INSPORT(A3),CHANPORTSPDp1(A2,D0.w)
  2439.  CLR CHANPIT(A2,D0.w)
  2440.  CLR CHANPORTPIT(A2,D0.w)
  2441.  CLR CHANVIBPIT(A2,D0.w)
  2442.  CLR CHANAEST(A2,D0.w)
  2443.  
  2444.  MOVE D4,CHANPRIO(A2,D0.w)
  2445.  MOVE CLOCK+2,CHANSTLO(A2,D0.w)
  2446.  MOVE CLOCK,CHANSTHI(A2,D0.w)
  2447.  MOVE D2,CHANVM(A2,D0.w)
  2448.  MOVE D3,CHANINST(A2,D0.w)
  2449.  
  2450.  LSR #1,D0
  2451.  MOVE.B #%11110110,D1
  2452.  ASL.B D0,D1
  2453.  AND.B D1,REG7
  2454.  MOVE.B INSWAVE(A3),D1
  2455.  ASL.B D0,D1
  2456.  OR.B D1,REG7
  2457. RTSS RTS
  2458.  
  2459. STARTPORT MOVE #4,D0
  2460. STPORT1 CMP CHANTRK(A2,D0.w),D5
  2461.  BEQ DOPORT
  2462.  SUB #2,D0
  2463.  BPL STPORT1
  2464.  jmp NOPORT
  2465. DOPORT CMP CHANINST(A2,D0.w),D3
  2466.  BNE STEAL
  2467.  MOVE CHANPITOFF(A2,D0.w),CHANPORTPIT(A2,D0.w)
  2468.  MOVE.L #PITCHTAB,A1
  2469.  ADD.B INSTRN(A3),D1
  2470.  AND.L #$FF,D1
  2471.  DIVU #12,D1
  2472.  SWAP D1
  2473.  ASL #1,D1
  2474.  MOVE 0(A1,D1.w),D3
  2475.  SWAP D1
  2476.  SUB #2,D1
  2477.  LSR D1,D3
  2478.  MOVE D3,CHANPITOFF(A2,D0.w)
  2479.  SUB D3,CHANPORTPIT(A2,D0.w)
  2480.  MOVE D2,CHANVM(A2,D0.w)
  2481.  RTS
  2482.  
  2483.  
  2484. STOPNOTE
  2485. NOTEOFF MOVE #4,D0
  2486.  MOVE.L #CHANDATA,A2
  2487. NOFF0 CMP CHANTRK(A2,D0.w),D5
  2488.  BNE NOFF1
  2489.  TST CHANINST(A2,D0.w)
  2490.  BMI NOFF1
  2491.  MOVE.B CHANARELST(A2,D0.w),CHANAESTp1(A2,D0.w)
  2492.  MOVE.B CHANPRELST(A2,D0.w),CHANPESTp1(A2,D0.w)
  2493. NOFF1 SUB #2,D0
  2494.  BPL NOFF0
  2495.  RTS
  2496.  
  2497. UPDATECHAN MOVE #4,D0
  2498.  MOVE.L #CHANDATA,A0
  2499. UPDATECHAN1 MOVE CHANINST(A0,D0.w),D1
  2500.  BMI NEXTCHAN
  2501.  MOVE.L INSTADD,A1
  2502.  MULU 2(A1),D1
  2503.  ADD D1,A1
  2504.  ADD #4,A1
  2505.  MOVE CHANVOL(A0,D0.w),D1
  2506.  MOVE CHANAEST(A0,D0.w),D2
  2507.  ASL #2,D2
  2508.  CMP INSAENV(A1,D2.w),D1
  2509.  BCS ADDTOA
  2510.  SUB INSAENVp2(A1,D2.w),D1
  2511.  CMP INSAENV(A1,D2.w),D1
  2512.  BGT DOPITCH
  2513.  MOVE INSAENV(A1,D2.w),D1
  2514.  ADD #1,CHANAEST(A0,D0.w)
  2515.  MOVE.B INSAREP(A1),D3
  2516.  LSR #2,D2
  2517.  CMP.B D2,D3
  2518.  BNE DOPITCH
  2519.  CLR CHANAEST(A0,D0.w)
  2520.  jmp DOPITCH
  2521. ADDTOA ADD INSAENVp2(A1,D2.w),D1
  2522.  CMP INSAENV(A1,D2.w),D1
  2523.  BLT DOPITCH
  2524.  MOVE INSAENV(A1,D2.w),D1
  2525.  ADD #1,CHANAEST(A0,D0.w)
  2526.  MOVE.B INSAREP(A1),D3
  2527.  LSR #2,D2
  2528.  CMP.B D2,D3
  2529.  BNE DOPITCH
  2530.  CLR CHANAEST(A0,D0.w)
  2531. DOPITCH MOVE D1,CHANVOL(A0,D0.w)
  2532.  MULU CHANVM(A0,D0.w),D1
  2533.  LSR.L #7,D1
  2534.  MULU VOLUME,D1
  2535.  LSR.L #8,D1
  2536.  LSR.L #7,D1
  2537.  LSR #1,D0
  2538.  ADD #8,D0
  2539.  jsr WSCHIP
  2540.  SUB #8,D0
  2541.  ASL #1,D0
  2542.  TST CHANVOL(A0,D0.w)
  2543.  BNE DOP2
  2544.  move.b #-1,CHANINST(A0,D0.w)
  2545.  jmp NEXTCHAN
  2546. DOP2 MOVE CHANPIT(A0,D0.w),D1
  2547.  MOVE CHANPEST(A0,D0.w),D2
  2548.  ASL #2,D2
  2549.  CMP INSPENV(A1,D2.w),D1
  2550.  BLE ADDTOP
  2551.  SUB INSPENVp2(A1,D2.w),D1
  2552.  CMP INSPENV(A1,D2.w),D1
  2553.  BGT DOOTHER
  2554.  MOVE INSPENV(A1,D2.w),D1
  2555.  ADD #1,CHANPEST(A0,D0.w)
  2556.  MOVE.B INSPREP(A1),D3
  2557.  LSR #2,D2
  2558.  CMP.B D2,D3
  2559.  BNE DOOTHER
  2560.  CLR CHANPEST(A0,D0.w)
  2561.  jmp DOOTHER
  2562. ADDTOP ADD INSPENVp2(A1,D2.w),D1
  2563.  CMP INSPENV(A1,D2.w),D1
  2564.  BLT DOOTHER
  2565.  MOVE INSPENV(A1,D2.w),D1
  2566.  ADD #1,CHANPEST(A0,D0.w)
  2567.  MOVE.B INSPREP(A1),D3
  2568.  LSR #2,D2
  2569.  CMP.B D2,D3
  2570.  BNE DOOTHER
  2571.  CLR CHANPEST(A0,D0.w)
  2572. DOOTHER MOVE D1,CHANPIT(A0,D0.w)
  2573.  MOVE CHANPORTPIT(A0,D0.w),D1
  2574.  BEQ DOOTHER2
  2575.  BPL SUBPORT
  2576.  ADD CHANPORTSPD(A0,D0.w),D1
  2577.  BMI DOOTHER2
  2578.  CLR D1
  2579.  jmp DOOTHER2
  2580. SUBPORT SUB CHANPORTSPD(A0,D0.w),D1
  2581.  BPL DOOTHER2
  2582.  CLR D1
  2583. DOOTHER2 MOVE D1,CHANPORTPIT(A0,D0.w)
  2584.  CLR D1
  2585.  TST CHANVIBDEP(A0,D0.w)
  2586.  BEQ DOOTHER3
  2587.  MOVE CHANVIBDEP(A0,D0.w),D2
  2588.  MOVE CHANVIBPIT(A0,D0.w),D1
  2589.  ADD CHANVIBSPD(A0,D0.w),D1
  2590.  BPL CHKPOSVIB
  2591.  NEG D2
  2592.  CMP D2,D1
  2593.  BCC DOOTHER3
  2594.  MOVE D2,D1
  2595.  NEG CHANVIBSPD(A0,D0.w)
  2596.  jmp DOOTHER3
  2597. CHKPOSVIB CMP D1,D2
  2598.  BCC DOOTHER3
  2599.  MOVE D2,D1
  2600.  NEG CHANVIBSPD(A0,D0.w)
  2601. DOOTHER3 MOVE D1,CHANVIBPIT(A0,D0.w)
  2602.  ASR #4,D1  ;VIB RANGE RED.
  2603.  MOVE CHANPIT(A0,D0.w),D2
  2604.  ASR #4,D2 ;ALSO RANGE REDUCED
  2605.  SUB D2,D1  ;PITCH ENV
  2606.  ADD CHANPITOFF(A0,D0.w),D1 ;NOTE
  2607.  ADD CHANPORTPIT(A0,D0.w),D1 ;PORTAMENTO
  2608.  MOVE D0,D2
  2609.  MOVE D1,D3
  2610.  LSR #1,D2
  2611.  BTST D2,REG7
  2612.  BNE MAYBNOISE
  2613.  jsr WSCHIP
  2614.  LSR #8,D1
  2615.  AND #$0F,D1
  2616.  ADD #1,D0
  2617.  jsr WSCHIP
  2618.  SUB #1,D0
  2619. MAYBNOISE ADD #3,D2
  2620.  BTST D2,REG7
  2621.  BNE NEXTCHAN
  2622.  MOVE D3,D1
  2623.  LSR #3,D1 ;NOISE FREQ RANGE RED. 0-7
  2624.  AND #31,D1
  2625.  MOVE D0,D3
  2626.  MOVE #6,D0
  2627.  jsr WSCHIP
  2628.  MOVE D3,D0
  2629.  
  2630. NEXTCHAN SUB #2,D0
  2631.  BPL UPDATECHAN1
  2632.  MOVE.B REG7,D1
  2633.  MOVE.B #7,D0
  2634.  jmp WSCHIP
  2635.  
  2636. WSCHIP MOVE.B D0,$FF8800
  2637.  MOVE.B D1,$FF8802
  2638.  RTS
  2639. PITCHTAB DC 3822,3607,3405,3214,3033,2863
  2640.  DC 2702,2551,2407,2272,2145,2024
  2641. MUSICON dc 0
  2642. CLOCK dc.l 0
  2643. CHANDATA dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2644. TRKDATA dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2645.  dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2646. HALF dc 0
  2647. TEMP1 dc.l 0
  2648. TEMP2 dc 0
  2649. REG7 dc 0
  2650. OLDIRQ dc.l 0
  2651. SONGADD DC.L 0
  2652. INSTADD DC.L 0
  2653. VOLUME DC 16
  2654. instblok
  2655.  dc.l $0005004A,$7F001200,$7E000002,$00001200,$00000000,$00000000
  2656.  dc.l $00000000,$00000000,$00000000,$0207AC00,$00570000,$00000000
  2657.  dc.l $00000000,$00000000,$00000000,$00000100,$00000000,$00000007
  2658.  dc.l $00000000,$00087F00,$12000000,$00480000,$00000000,$00000000
  2659.  dc.l $00000000,$00000000,$00000000,$00000107,$AC00004A,$00000000
  2660.  dc.l $00000000,$00000000,$00000000,$00000000,$01000000,$00000000
  2661.  dc.l $000765FF,$00000008,$7F001200,$4A000400,$00000E00,$00000000
  2662.  dc.l $00000000,$00000000,$00000000,$00000000,$0207F000,$014A0600
  2663.  dc.l $01030000,$00000000,$00000000,$00000000,$00000100,$00000000
  2664.  dc.l $00000107,$B8FF0000,$00087F00,$12000000,$00000000,$12000000
  2665.  dc.l $00000000,$00000000,$00000000,$00000000,$00000207,$0B000006
  2666.  dc.l $00000004,$00000004,$00000000,$00000000,$00000000,$01000000
  2667.  dc.l $00000000,$0201B8FF,$00000008,$7F007F00,$000000DA,$00001200
  2668.  dc.l $00000000,$00000000,$00000000,$00000000,$00000000,$02071600
  2669.  dc.l $0900F500,$0B000D00,$0C00F900,$07000E00,$0A00F300,$0D001200
  2670.  dc.l $1100F400,$0C000007,$1AFF0000,$01002064,$632E6C20,$24303030
  2671.  
  2672. * Thus spoke the master programmer:
  2673. * "Time for you to leave."
  2674.  
  2675. *---------Variables and Storage---------*
  2676.  
  2677.  BSS
  2678.  EVEN
  2679.  
  2680. * CELL_SIZE x CELL_COUNT x CELL_TYPES x num of chars
  2681.  
  2682. CELLS DS.L 35712
  2683.  EVEN
  2684.  
  2685. SQUARE_COUNT DS 1
  2686. LEVEL DS 1
  2687. QUIT_FLAG DS 1
  2688. DISC_ADR DS.L 1
  2689. FLOATING DS 1
  2690. FLOATING2 DS 1
  2691. POINTS DS.L 1
  2692. BONUS DS.L 1
  2693. LIVES DS 1
  2694.  
  2695. HOLDEN DS.L 1
  2696. VCOUNT DS 1
  2697. COLOR_COUNT DS 1
  2698. COUNT DS 1
  2699. COUNT2 DS 1
  2700. COUNT3 DS 1
  2701. COUNTER DS 1
  2702.  
  2703. DONT_MOVE_THIS DS 2
  2704. COLORS DS 18
  2705. HLP_COLORS DS 18
  2706. TTL_COLORS DS 18
  2707. REAL_COLORS DS 18
  2708. OLD_REZ DS 1
  2709. OLD_COLORS DS 16
  2710. OLDSCREEN DS.L 1
  2711.  
  2712. SCREENFLIP DS.L 1
  2713. FLIPSTATUS DS 1
  2714.  
  2715. SOUND_COUNT DS 1
  2716.  
  2717. PLAYER_INFO DS.B PLAYER_SIZE*PLAYER_MAX
  2718.  EVEN
  2719.  
  2720. LFSIZE DS.L 1  ;File Loader Variables
  2721. LFADR DS.L 1
  2722. LFCOLORADR DS.L 1
  2723. FHANDLE DS 1
  2724.  
  2725. GRID DS.B 100    ;Square status block
  2726. DISCLOC DS.B 128 ;Disc Location Information
  2727.  EVEN
  2728.  
  2729. STOREA7 DS.L 1
  2730. savea7 ds.l 1
  2731. HELPDATA DS.B 32000
  2732. TITLEDATA DS.B 32000
  2733. SCOREDATA DS.B 32000
  2734. DECODE DS.B 32000
  2735. OPPONENTS DS.B 32000
  2736. PLAYIMAGE DS.B 32000
  2737. playfield
  2738. PLAYFIELD DS.B 32000
  2739.  EVEN
  2740.  
  2741. MOVETBL DS 500 ;Movement information
  2742.  
  2743.  END
  2744.